Skip to content

Commit 5b04e6b

Browse files
authored
[Collections] Don't allow package.versions to be empty (#3516)
Motivation: Currently packages in a collection can have `versions` array be empty. Can't remember if this was intentional but a package that has no versions is not very useful. Modification: Update validation to fail when `package.versions` is empty.
1 parent ababf36 commit 5b04e6b

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

Sources/PackageCollections/PackageCollections+Validation.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,11 @@ extension PackageCollectionModel.V1 {
8282
private func validate(package: Collection.Package, messages: inout [ValidationMessage]) {
8383
let packageID = PackageIdentity(url: package.url.absoluteString).description
8484

85+
guard !package.versions.isEmpty else {
86+
messages.append(.error("Package \(packageID) does not have any versions.", property: "package.versions"))
87+
return
88+
}
89+
8590
// Check for duplicate versions
8691
let nonUniqueVersions = Dictionary(grouping: package.versions, by: { $0.version }).filter { $1.count > 1 }.keys
8792
if !nonUniqueVersions.isEmpty {

Tests/PackageCollectionsTests/PackageCollectionValidationTests.swift

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,38 @@ class PackageCollectionValidationTests: XCTestCase {
177177
XCTAssertNotNil(messages[0].message.range(of: "more than the recommended", options: .caseInsensitive))
178178
}
179179

180+
func test_validationFailed_noVersions() throws {
181+
let packages = [
182+
Model.Collection.Package(
183+
url: URL(string: "https://package-collection-tests.com/repos/foobar.git")!,
184+
summary: "Package Foobar",
185+
keywords: ["test package"],
186+
versions: [],
187+
readmeURL: nil,
188+
license: nil
189+
),
190+
]
191+
let collection = Model.Collection(
192+
name: "Test Package Collection",
193+
overview: "A test package collection",
194+
keywords: ["swift packages"],
195+
packages: packages,
196+
formatVersion: .v1_0,
197+
revision: 3,
198+
generatedAt: Date(),
199+
generatedBy: .init(name: "Jane Doe")
200+
)
201+
202+
let validator = Model.Validator()
203+
let messages = validator.validate(collection: collection)!
204+
XCTAssertEqual(1, messages.count)
205+
206+
guard case .error = messages[0].level else {
207+
return XCTFail("Expected .error")
208+
}
209+
XCTAssertNotNil(messages[0].message.range(of: "does not have any versions", options: .caseInsensitive))
210+
}
211+
180212
func test_validationFailed_duplicateVersions_emptyProductsAndTargets() throws {
181213
let packages = [
182214
Model.Collection.Package(

0 commit comments

Comments
 (0)