From a52b10d959288a603a96521df942637b625787cf Mon Sep 17 00:00:00 2001 From: Jonathan Grynspan Date: Thu, 4 Dec 2025 15:54:23 -0500 Subject: [PATCH] Bump `ABI.CurrentVersion` to 6.3 and ensure minor variances in JSON version numbers are permitted. This PR ensures that the JSON schema version 6.3 is considered "supported" in Swift Testing 6.3. As well, it suppresses a thrown error when the `version` field of a JSON record is slightly higher than the expected schema. For example, if we ask Swift Testing the ABI version corresponding to `VersionNumber(6, 3, 1)`, we'll get back `v6_3`, but then if we try to decode a JSON record whose `version` field equals `"6.3.1"`, we'll throw a version mismatch error. This error is now suppressed unless the versions really do mismatch. --- Sources/Testing/ABI/ABI.Record.swift | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/Sources/Testing/ABI/ABI.Record.swift b/Sources/Testing/ABI/ABI.Record.swift index 40a8d4bc3..2c101ec40 100644 --- a/Sources/Testing/ABI/ABI.Record.swift +++ b/Sources/Testing/ABI/ABI.Record.swift @@ -70,8 +70,17 @@ extension ABI.Record: Codable { init(from decoder: any Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) - let versionNumber = try container.decode(VersionNumber.self, forKey: .version) - if versionNumber != V.versionNumber { + func validateVersionNumber(_ versionNumber: VersionNumber) throws { + if versionNumber == V.versionNumber { + return + } +#if !hasFeature(Embedded) + // Allow for alternate version numbers if they correspond to the expected + // record version (e.g. "1.2.3" might map to `v1_2_0` without a problem.) + if ABI.version(forVersionNumber: versionNumber) == V.self { + return + } +#endif throw DecodingError.dataCorrupted( DecodingError.Context( codingPath: decoder.codingPath + CollectionOfOne(CodingKeys.version as any CodingKey), @@ -79,6 +88,8 @@ extension ABI.Record: Codable { ) ) } + let versionNumber = try container.decode(VersionNumber.self, forKey: .version) + try validateVersionNumber(versionNumber) switch try container.decode(String.self, forKey: .kind) { case "test":