Skip to content

Commit d0fe23d

Browse files
committed
Add custom collection query to package collection generator
1 parent de1adea commit d0fe23d

File tree

3 files changed

+51
-1
lines changed

3 files changed

+51
-1
lines changed

Sources/App/Core/PackageCollection+VersionResult.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@ extension PackageCollection.VersionResult {
5555
switch filter {
5656
case let .author(owner):
5757
query.filter(Repository.self, \Repository.$owner, .custom("ilike"), owner)
58+
case let .customCollection(name):
59+
query
60+
.join(CustomCollectionPackage.self, on: \Package.$id == \CustomCollectionPackage.$package.$id)
61+
.join(CustomCollection.self, on: \CustomCollection.$id == \CustomCollectionPackage.$customCollection.$id)
62+
.filter(CustomCollection.self, \.$name == name)
5863
case let .urls(packageURLs):
5964
query.filter(App.Package.self, \.$url ~~ packageURLs)
6065
}

Sources/App/Core/PackageCollection+generate.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ extension PackageCollection {
3434
enum Filter {
3535
case urls([String])
3636
case author(String)
37+
case customCollection(String)
3738
}
3839

3940
enum Error: Swift.Error {
@@ -97,10 +98,14 @@ extension PackageCollection {
9798
return owner
9899
case (.author, .some(let label)):
99100
return label
100-
case (.urls, .some(let label)):
101+
case (.customCollection(let name), .none):
102+
return name
103+
case (.customCollection, .some(let label)):
101104
return label
102105
case (.urls(let urls), .none):
103106
return author(for: urls)
107+
case (.urls, .some(let label)):
108+
return label
104109
}
105110
}
106111

Tests/AppTests/PackageCollectionTests.swift

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,46 @@ class PackageCollectionTests: AppTestCase {
168168
["package 0", "package 1"])
169169
}
170170

171+
func test_query_custom() async throws {
172+
// Tests PackageResult.query with the custom collection filter option
173+
// setup
174+
let packages = try await (0..<3).mapAsync { index in
175+
let pkg = try await savePackage(on: app.db, "url-\(index)".url)
176+
do {
177+
let v = try Version(package: pkg,
178+
latest: .release,
179+
packageName: "package \(index)",
180+
reference: .tag(1, 2, 3),
181+
toolsVersion: "5.4")
182+
try await v.save(on: app.db)
183+
try await Build(version: v,
184+
buildCommand: "build \(index)",
185+
platform: .iOS,
186+
status: .ok,
187+
swiftVersion: .v1)
188+
.save(on: app.db)
189+
try await Product(version: v, type: .library(.automatic), name: "product \(index)")
190+
.save(on: app.db)
191+
try await Target(version: v, name: "target \(index)")
192+
.save(on: app.db)
193+
}
194+
try await Repository(package: pkg, name: "repo \(index)", owner: "owner")
195+
.save(on: app.db)
196+
return pkg
197+
}
198+
let collection = CustomCollection(id: .id2, .init(name: "List", url: "https://github.com/foo/bar/list.json"))
199+
try await collection.save(on: app.db)
200+
try await collection.$packages.attach([packages[0], packages[1]], on: app.db)
201+
202+
// MUT
203+
let res = try await VersionResult.query(on: self.app.db,
204+
filterBy: .customCollection("List"))
205+
206+
// validate selection (relationship loading is tested in test_query_filter_urls)
207+
XCTAssertEqual(res.map(\.version.packageName),
208+
["package 0", "package 1"])
209+
}
210+
171211
func test_Version_init() async throws {
172212
// Tests PackageCollection.Version initialisation from App.Version
173213
// setup

0 commit comments

Comments
 (0)