Skip to content

Commit

Permalink
Merge pull request #2110 from SwiftPackageIndex/fix-1887
Browse files Browse the repository at this point in the history
Add documentation generation badges
  • Loading branch information
daveverwer committed Nov 2, 2022
2 parents 6d3e7c0 + 98984df commit 2a48ec1
Show file tree
Hide file tree
Showing 6 changed files with 148 additions and 76 deletions.
2 changes: 2 additions & 0 deletions FrontEnd/styles/colors.scss
Expand Up @@ -121,6 +121,7 @@
--grid-incompatible-background: var(--light-grey);
--grid-succeeded-background: var(--very-light-grey);
--grid-failed-background: var(--very-light-grey);
--grid-callout-background: var(--white);

--package-list-border: var(--very-light-grey);
--package-list-background: var(--very-very-light-grey);
Expand Down Expand Up @@ -226,6 +227,7 @@
--grid-incompatible-background: var(--very-dark-grey);
--grid-succeeded-background: var(--very-dark-grey);
--grid-failed-background: var(--very-dark-grey);
--grid-callout-background: var(--black);

--package-list-border: var(--very-dark-grey);
--package-list-background: var(--very-very-dark-grey);
Expand Down
15 changes: 15 additions & 0 deletions FrontEnd/styles/matrix.scss
Expand Up @@ -150,6 +150,7 @@
}

.results > div {
position: relative;
background-color: var(--grid-default-background);

&.succeeded > a,
Expand All @@ -175,6 +176,20 @@
background-image: var(--image-build-failed);
}
}

> .generated-docs {
position: absolute;
right: 5px;
display: inline-block;
width: 25px;
height: 25px;
background-position: center;
background-repeat: no-repeat;
background-size: 15px;
background-color: var(--grid-callout-background);
background-image: var(--image-documentation);
border-radius: 50%;
}
}
}
}
31 changes: 22 additions & 9 deletions Sources/App/Views/PackageController/Builds/BuildIndex+Model.swift
Expand Up @@ -59,7 +59,9 @@ private extension Array where Element == PackageController.BuildsRoute.BuildInfo
BuildIndex.Model.BuildInfo.init(id: $0.buildId,
swiftVersion: $0.swiftVersion,
platform: $0.platform,
status: $0.status)
status: $0.status,
// TODO: Replace `generatedDocs: false` as part of #1888.
generatedDocs: false)
}
return .init(name: name, kind: kind, builds: buildInfo)
}
Expand Down Expand Up @@ -87,17 +89,20 @@ extension BuildIndex.Model {
var platform: App.Build.Platform
var status: App.Build.Status
var swiftVersion: App.SwiftVersion
var generatedDocs: Bool

var isCompleted: Bool { status.isCompleted }

init(id: App.Build.Id,
swiftVersion: App.SwiftVersion,
platform: App.Build.Platform,
status: App.Build.Status) {
status: App.Build.Status,
generatedDocs: Bool) {
self.id = id
self.platform = platform
self.status = status
self.swiftVersion = swiftVersion
self.generatedDocs = generatedDocs
}
}
}
Expand All @@ -118,7 +123,7 @@ extension BuildIndex.Model {
var column = [RowIndex: BuildCell]()
for build in group.builds {
guard let index = RowIndex(build) else { continue }
column[index] = .init(group.name, group.kind, build.id, build.status)
column[index] = .init(group.name, group.kind, build.id, build.status, generatedDocs: build.generatedDocs)
}
RowIndex.all.forEach {
values[$0, default: []]
Expand All @@ -137,10 +142,12 @@ extension BuildIndex.Model {
struct BuildCell: Equatable {
var column: ColumnIndex
var value: Value?
var generatedDocs: Bool?

init(_ column: String, _ kind: App.Version.Kind, _ id: App.Build.Id, _ status: Build.Status) {
init(_ column: String, _ kind: App.Version.Kind, _ id: App.Build.Id, _ status: Build.Status, generatedDocs: Bool) {
self.column = .init(label: column, kind: kind)
self.value = .init(id: id, status: status)
self.generatedDocs = generatedDocs
}

init(_ column: String, _ kind: App.Version.Kind) {
Expand All @@ -156,29 +163,35 @@ extension BuildIndex.Model {
let buildURL = SiteURL.builds(.value(value.id)).relativeURL()

switch value.status {
case .ok: return cell(text: "Build Succeeded", linkURL: buildURL, cssClass: "succeeded")
case .failed: return cell(text: "Build Failed", linkURL: buildURL, cssClass: "failed")
case .ok: return cell(text: "Build Succeeded", linkURL: buildURL, cssClass: "succeeded", generatedDocs: generatedDocs)
case .failed: return cell(text: "Build Failed", linkURL: buildURL, cssClass: "failed", generatedDocs: generatedDocs)
case .triggered: return cell(text: "Build Queued")
case .infrastructureError: return cell(text: "Build Errored")
case .timeout: return cell(text: "Build Timed Out")
}
}

func cell(text: String) -> Node<HTML.BodyContext> {
return .div(
.div(
.span(
.text(text)
)
)
}

func cell(text: String, linkURL: String, cssClass: String) -> Node<HTML.BodyContext> {
func cell(text: String, linkURL: String, cssClass: String, generatedDocs: Bool?) -> Node<HTML.BodyContext> {
return .div(
.class(cssClass),
.a(
.href(linkURL),
.text(text)
)
),
.unwrap(generatedDocs, { generatedDocs in
.if(generatedDocs, .span(
.class("generated-docs"),
.title("If successful, this build generated package documentation.")
))
})
)
}

Expand Down
67 changes: 53 additions & 14 deletions Tests/AppTests/BuildIndexModelTests.swift
Expand Up @@ -70,13 +70,13 @@ class BuildIndexModelTests: AppTestCase {
// setup
let id = UUID()
let stable: [BuildInfo] = [
.init(id: id, swiftVersion: .init(5, 6, 0), platform: .ios, status: .ok),
.init(id: id, swiftVersion: .init(5, 5, 0), platform: .macosXcodebuild, status: .ok),
.init(id: id, swiftVersion: .init(5, 4, 0), platform: .tvos, status: .ok),
.init(id: id, swiftVersion: .init(5, 6, 0), platform: .ios, status: .ok, generatedDocs: true),
.init(id: id, swiftVersion: .init(5, 5, 0), platform: .macosXcodebuild, status: .ok, generatedDocs: false),
.init(id: id, swiftVersion: .init(5, 4, 0), platform: .tvos, status: .ok, generatedDocs: false),
]
let latest: [BuildInfo] = [
.init(id: id, swiftVersion: .init(5, 5, 0), platform: .macosSpm, status: .failed),
.init(id: id, swiftVersion: .init(5, 4, 0), platform: .tvos, status: .ok),
.init(id: id, swiftVersion: .init(5, 5, 0), platform: .macosSpm, status: .failed, generatedDocs: false),
.init(id: id, swiftVersion: .init(5, 4, 0), platform: .tvos, status: .ok, generatedDocs: false),
]
let model = BuildIndex.Model.init(owner: "foo",
ownerName: "Foo",
Expand Down Expand Up @@ -121,13 +121,13 @@ class BuildIndexModelTests: AppTestCase {
// setup
let id = UUID()
let stable: [BuildInfo] = [
.init(id: id, swiftVersion: .init(5, 6, 0), platform: .ios, status: .ok),
.init(id: id, swiftVersion: .init(5, 5, 0), platform: .macosXcodebuild, status: .ok),
.init(id: id, swiftVersion: .init(5, 4, 0), platform: .tvos, status: .ok),
.init(id: id, swiftVersion: .init(5, 6, 0), platform: .ios, status: .ok, generatedDocs: false),
.init(id: id, swiftVersion: .init(5, 5, 0), platform: .macosXcodebuild, status: .ok, generatedDocs: false),
.init(id: id, swiftVersion: .init(5, 4, 0), platform: .tvos, status: .ok, generatedDocs: false),
]
let latest: [BuildInfo] = [
.init(id: id, swiftVersion: .init(5, 5, 0), platform: .macosSpm, status: .failed),
.init(id: id, swiftVersion: .init(5, 4, 0), platform: .tvos, status: .ok),
.init(id: id, swiftVersion: .init(5, 5, 0), platform: .macosSpm, status: .failed, generatedDocs: false),
.init(id: id, swiftVersion: .init(5, 4, 0), platform: .tvos, status: .ok, generatedDocs: false),
]
let model = BuildIndex.Model.init(owner: "foo",
ownerName: "Foo",
Expand Down Expand Up @@ -169,10 +169,13 @@ class BuildIndexModelTests: AppTestCase {

func test_BuildCell() throws {
let id = UUID()
XCTAssertEqual(BuildCell("1.2.3", .release, id, .ok).node.render(), """
XCTAssertEqual(BuildCell("1.2.3", .release, id, .ok, generatedDocs: false).node.render(), """
<div class="succeeded"><a href="/builds/\(id.uuidString)">Build Succeeded</a></div>
""")
XCTAssertEqual(BuildCell("1.2.3", .release, id, .failed).node.render(), """
XCTAssertEqual(BuildCell("1.2.3", .release, id, .ok, generatedDocs: true).node.render(), """
<div class="succeeded"><a href="/builds/\(id.uuidString)">Build Succeeded</a><span class="generated-docs" title="If successful, this build generated package documentation."></span></div>
""")
XCTAssertEqual(BuildCell("1.2.3", .release, id, .failed, generatedDocs: false).node.render(), """
<div class="failed"><a href="/builds/\(id.uuidString)">Build Failed</a></div>
""")
XCTAssertEqual(BuildCell("1.2.3", .release).node.render(), """
Expand All @@ -184,9 +187,9 @@ class BuildIndexModelTests: AppTestCase {
// setup
let id = UUID()
let bi = BuildItem(index: .init(swiftVersion: .v5_7, platform: .ios),
values: [.init("1.2.3", .release, id, .ok),
values: [.init("1.2.3", .release, id, .ok, generatedDocs: false),
.init("2.0.0-b1", .preRelease),
.init("develop", .defaultBranch, id, .failed)])
.init("develop", .defaultBranch, id, .failed, generatedDocs: false)])

// MUT - altogether now
let node = bi.node
Expand All @@ -213,6 +216,42 @@ class BuildIndexModelTests: AppTestCase {
XCTAssertEqual(node.render(), expectation.render())
}

func test_BuildItem_generatedDocs() throws {
// setup
let id = UUID()
let bi = BuildItem(index: .init(swiftVersion: .v5_7, platform: .ios),
values: [ .init("main", .defaultBranch, id, .ok, generatedDocs: true) ])

// MUT
let node = bi.node

let expectation: Node<HTML.ListContext> = .li(
.class("row"),
.div(
.class("row-labels"),
.strong("iOS")
),
.div(
.class("column-labels"),
.div(.span(.class("branch"), .text("main")))
),
.div(
.class("results"),
.div(
.class("succeeded"),
.a(
.href("/builds/\(id.uuidString)"),
.text("Build Succeeded")
),
.span(
.class("generated-docs"),
.title("If successful, this build generated package documentation.")
)
)
)
)
XCTAssertEqual(node.render(), expectation.render())
}
}


Expand Down

0 comments on commit 2a48ec1

Please sign in to comment.