Skip to content

Commit 91a2432

Browse files
Merge pull request #3326 from SwiftPackageIndex/more-ELF-to-async-await
More elf to async await
2 parents 6b16790 + 2433e86 commit 91a2432

File tree

13 files changed

+101
-129
lines changed

13 files changed

+101
-129
lines changed

Sources/App/Commands/Analyze.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -158,9 +158,9 @@ extension Analyze {
158158

159159
try await RecentPackage.refresh(on: database)
160160
try await RecentRelease.refresh(on: database)
161-
try await Search.refresh(on: database).get()
162-
try await Stats.refresh(on: database).get()
163-
try await WeightedKeyword.refresh(on: database).get()
161+
try await Search.refresh(on: database)
162+
try await Stats.refresh(on: database)
163+
try await WeightedKeyword.refresh(on: database)
164164
}
165165

166166

Sources/App/Commands/CreateRestfile.swift

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,24 +31,24 @@ enum Variant: String, LosslessStringConvertible {
3131
}
3232

3333

34-
struct CreateRestfileCommand: Command {
34+
struct CreateRestfileCommand: AsyncCommand {
3535
struct Signature: CommandSignature {
3636
@Argument(name: "variant")
3737
var variant: Variant
3838
}
3939

4040
var help: String { "Create restfile for automated testing" }
4141

42-
func run(using context: CommandContext, signature: Signature) throws {
42+
func run(using context: CommandContext, signature: Signature) async throws {
4343
guard let db = context.application.db as? SQLDatabase else {
4444
fatalError("Database must be an SQLDatabase ('as? SQLDatabase' must succeed)")
4545
}
46-
try createRestfile(on: db, variant: signature.variant).wait()
46+
try await createRestfile(on: db, variant: signature.variant)
4747
}
4848
}
4949

5050

51-
func createRestfile(on database: SQLDatabase, variant: Variant) -> EventLoopFuture<Void> {
51+
func createRestfile(on database: SQLDatabase, variant: Variant) async throws {
5252
let mode: String
5353
let query: SQLQueryString
5454
switch variant {
@@ -96,14 +96,12 @@ func createRestfile(on database: SQLDatabase, variant: Variant) -> EventLoopFutu
9696
print("# auto-generated via `Run create-restfile \(variant.rawValue)`")
9797
print("mode: \(mode)")
9898
print("requests:")
99-
return database.raw(query)
100-
.all(decoding: Record.self)
101-
.mapEach { r in
102-
print("""
99+
for r in try await database.raw(query).all(decoding: Record.self) {
100+
print("""
103101
\(r.url):
104102
url: ${base_url}\(r.url)
105103
validation:
106104
status: .regex((2|3)\\d\\d)
107105
""")
108-
}.transform(to: ())
106+
}
109107
}

Sources/App/Commands/ReAnalyzeVersions.swift

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,7 @@ enum ReAnalyzeVersions {
8888
}
8989
}
9090
do {
91-
try await AppMetrics.push(client: client,
92-
jobName: "re-analyze-versions")
93-
.get()
91+
try await AppMetrics.push(client: client, jobName: "re-analyze-versions")
9492
} catch {
9593
Current.logger().warning("\(error.localizedDescription)")
9694
}

Sources/App/Core/AppMetrics.swift

Lines changed: 10 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -169,45 +169,23 @@ extension AppMetrics {
169169
/// a `/metrics` endpoint that could be scraped. Instead, they push to a gateway that is configured as a Prometheus
170170
/// scrape target.
171171
/// - Parameter client: client for POST request
172-
/// - Returns: future
173-
static func push(client: Client, jobName: String) -> EventLoopFuture<Void> {
172+
static func push(client: Client, jobName: String) async throws {
174173
guard let pushGatewayUrl = Current.metricsPushGatewayUrl() else {
175-
return client.eventLoop.future(error: AppError.envVariableNotSet("METRICS_PUSHGATEWAY_URL"))
174+
throw AppError.envVariableNotSet("METRICS_PUSHGATEWAY_URL")
176175
}
177176
let url = URI(string: "\(pushGatewayUrl)/metrics/job/\(jobName)")
178177

179-
let promise = client.eventLoop.makePromise(of: String.self)
180178
do {
181-
try MetricsSystem.prometheus().collect(into: promise)
179+
let metrics: String = try await MetricsSystem.prometheus().collect()
180+
_ = try await client.post(url) { req in
181+
// append "\n" to avoid
182+
// text format parsing error in line 4: unexpected end of input stream
183+
try req.content.encode(metrics + "\n")
184+
}
182185
} catch {
183-
return client.eventLoop.future(error: error)
186+
Current.logger().warning("AppMetrics.push failed with error: \(error)")
187+
// ignore error - we don't want metrics issues to cause upstream failures
184188
}
185-
186-
let req = promise.futureResult
187-
.flatMap { metrics in
188-
client.post(url) { req in
189-
// append "\n" to avoid
190-
// text format parsing error in line 4: unexpected end of input stream
191-
try req.content.encode(metrics + "\n")
192-
}
193-
}
194-
.transform(to: ())
195-
196-
return req
197-
.flatMapError { error in
198-
Current.logger().warning("AppMetrics.push failed with error: \(error)")
199-
// absorb error - we don't want metrics issues to cause upstream failures
200-
return client.eventLoop.future()
201-
}
202-
}
203-
204-
205-
/// Async-await wrapper for `EventLoopFuture`-based `push`
206-
/// - Parameters:
207-
/// - client: `Client`
208-
/// - jobName: job name
209-
static func push(client: Client, jobName: String) async throws {
210-
try await push(client: client, jobName: jobName).get()
211189
}
212190

213191
}

Sources/App/Core/Search.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -402,10 +402,10 @@ enum Search {
402402
}
403403
}
404404

405-
static func refresh(on database: Database) -> EventLoopFuture<Void> {
405+
static func refresh(on database: Database) async throws {
406406
guard let db = database as? SQLDatabase else {
407407
fatalError("Database must be an SQLDatabase ('as? SQLDatabase' must succeed)")
408408
}
409-
return db.raw("REFRESH MATERIALIZED VIEW \(ident: Self.schema)").run()
409+
try await db.raw("REFRESH MATERIALIZED VIEW \(ident: Self.schema)").run()
410410
}
411411
}

Sources/App/Core/Stats.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@ struct Stats: Decodable, Equatable {
2828
}
2929

3030
extension Stats {
31-
static func refresh(on database: Database) -> EventLoopFuture<Void> {
31+
static func refresh(on database: Database) async throws {
3232
guard let db = database as? SQLDatabase else {
3333
fatalError("Database must be an SQLDatabase ('as? SQLDatabase' must succeed)")
3434
}
35-
return db.raw("REFRESH MATERIALIZED VIEW \(ident: Self.schema)").run()
35+
try await db.raw("REFRESH MATERIALIZED VIEW \(ident: Self.schema)").run()
3636
}
3737

3838

Sources/App/Models/WeightedKeyword.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,11 @@ extension WeightedKeyword {
4848
.all(decoding: Self.self)
4949
}
5050

51-
static func refresh(on database: Database) -> EventLoopFuture<Void> {
51+
static func refresh(on database: Database) async throws {
5252
guard let db = database as? SQLDatabase else {
5353
fatalError("Database must be an SQLDatabase ('as? SQLDatabase' must succeed)")
5454
}
55-
return db.raw("REFRESH MATERIALIZED VIEW \(ident: Self.schema)").run()
55+
try await db.raw("REFRESH MATERIALIZED VIEW \(ident: Self.schema)").run()
5656
}
5757
}
5858

Sources/App/routes.swift

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -275,10 +275,8 @@ func routes(_ app: Application) throws {
275275
}
276276

277277
do { // Metrics
278-
app.get("metrics") { req -> EventLoopFuture<String> in
279-
let promise = req.eventLoop.makePromise(of: String.self)
280-
try MetricsSystem.prometheus().collect(into: promise)
281-
return promise.futureResult
278+
app.get("metrics") { req -> String in
279+
try await MetricsSystem.prometheus().collect()
282280
}.excludeFromOpenAPI()
283281
}
284282
}

Tests/AppTests/ApiTests.swift

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ class ApiTests: AppTestCase {
6464
summary: "foo bar package").save(on: app.db)
6565
try await Version(package: p1, packageName: "Foo", reference: .branch("main")).save(on: app.db)
6666
try await Version(package: p2, packageName: "Bar", reference: .branch("main")).save(on: app.db)
67-
try await Search.refresh(on: app.db).get()
67+
try await Search.refresh(on: app.db)
6868

6969
let event = ActorIsolated<TestEvent?>(nil)
7070
Current.postPlausibleEvent = { @Sendable _, kind, path, _ in
@@ -805,7 +805,7 @@ class ApiTests: AppTestCase {
805805
try await v.save(on: app.db)
806806
try await Product(version: v, type: .library(.automatic), name: "lib")
807807
.save(on: app.db)
808-
try await Search.refresh(on: app.db).get()
808+
try await Search.refresh(on: app.db)
809809

810810
let event = ActorIsolated<TestEvent?>(nil)
811811
Current.postPlausibleEvent = { @Sendable _, kind, path, _ in
@@ -850,47 +850,47 @@ class ApiTests: AppTestCase {
850850
}
851851
}
852852

853-
func test_package_collections_packageURLs() throws {
853+
func test_package_collections_packageURLs() async throws {
854854
try XCTSkipIf(!isRunningInCI && Current.collectionSigningPrivateKey() == nil, "Skip test for local user due to unset COLLECTION_SIGNING_PRIVATE_KEY env variable")
855855
// setup
856856
let refDate = Date(timeIntervalSince1970: 0)
857857
Current.date = { refDate }
858858
Current.apiSigningKey = { "secret" }
859859
let p1 = Package(id: UUID(uuidString: "442cf59f-0135-4d08-be00-bc9a7cebabd3")!,
860860
url: "1")
861-
try p1.save(on: app.db).wait()
861+
try await p1.save(on: app.db)
862862
let p2 = Package(id: UUID(uuidString: "4e256250-d1ea-4cdd-9fe9-0fc5dce17a80")!,
863863
url: "2")
864-
try p2.save(on: app.db).wait()
865-
try Repository(package: p1,
866-
defaultBranch: "main",
867-
summary: "some package").save(on: app.db).wait()
868-
try Repository(package: p2,
869-
defaultBranch: "main",
870-
name: "name 2",
871-
owner: "foo",
872-
summary: "foo bar package").save(on: app.db).wait()
864+
try await p2.save(on: app.db)
865+
try await Repository(package: p1,
866+
defaultBranch: "main",
867+
summary: "some package").save(on: app.db)
868+
try await Repository(package: p2,
869+
defaultBranch: "main",
870+
name: "name 2",
871+
owner: "foo",
872+
summary: "foo bar package").save(on: app.db)
873873
do {
874874
let v = try Version(package: p1,
875875
latest: .release,
876876
packageName: "Foo",
877877
reference: .tag(1, 2, 3),
878878
toolsVersion: "5.3")
879-
try v.save(on: app.db).wait()
880-
try Product(version: v, type: .library(.automatic), name: "p1")
881-
.save(on: app.db).wait()
879+
try await v.save(on: app.db)
880+
try await Product(version: v, type: .library(.automatic), name: "p1")
881+
.save(on: app.db)
882882
}
883883
do {
884884
let v = try Version(package: p2,
885885
latest: .release,
886886
packageName: "Bar",
887887
reference: .tag(2, 0, 0),
888888
toolsVersion: "5.4")
889-
try v.save(on: app.db).wait()
890-
try Product(version: v, type: .library(.automatic), name: "p2")
891-
.save(on: app.db).wait()
889+
try await v.save(on: app.db)
890+
try await Product(version: v, type: .library(.automatic), name: "p2")
891+
.save(on: app.db)
892892
}
893-
try Search.refresh(on: app.db).wait()
893+
try await Search.refresh(on: app.db)
894894

895895
do { // MUT
896896
let body: ByteBuffer = .init(string: """
@@ -913,16 +913,16 @@ class ApiTests: AppTestCase {
913913
}
914914
""")
915915

916-
try app.test(.POST,
917-
"api/package-collections",
918-
headers: .bearerApplicationJSON((try .apiToken(secretKey: "secret", tier: .tier3))),
919-
body: body,
920-
afterResponse: { res in
921-
// validation
922-
XCTAssertEqual(res.status, .ok)
923-
let pkgColl = try res.content.decode(PackageCollection.self)
924-
assertSnapshot(of: pkgColl, as: .dump)
925-
})
916+
try await app.test(.POST,
917+
"api/package-collections",
918+
headers: .bearerApplicationJSON((try .apiToken(secretKey: "secret", tier: .tier3))),
919+
body: body,
920+
afterResponse: { res async throws in
921+
// validation
922+
XCTAssertEqual(res.status, .ok)
923+
let pkgColl = try res.content.decode(PackageCollection.self)
924+
assertSnapshot(of: pkgColl, as: .dump)
925+
})
926926
}
927927
}
928928

0 commit comments

Comments
 (0)