diff --git a/Sources/ProjectDescription/Dump.swift b/Sources/ProjectDescription/Dump.swift index 6c8b119d5..b9fa7c445 100644 --- a/Sources/ProjectDescription/Dump.swift +++ b/Sources/ProjectDescription/Dump.swift @@ -3,7 +3,9 @@ import Foundation func dumpIfNeeded(_ entity: E) { if CommandLine.argc > 0 { if CommandLine.arguments.contains("--dump") { - let data = try! JSONEncoder().encode(entity) + let encoder = JSONEncoder() + encoder.keyEncodingStrategy = .convertToSnakeCase + let data = try! encoder.encode(entity) let string = String(data: data, encoding: .utf8)! print(string) } diff --git a/Sources/ProjectDescription/Headers.swift b/Sources/ProjectDescription/Headers.swift index f6f99cd4f..819211981 100644 --- a/Sources/ProjectDescription/Headers.swift +++ b/Sources/ProjectDescription/Headers.swift @@ -18,5 +18,4 @@ public class Headers: Codable { self.private = `private` self.project = project } - } diff --git a/Sources/ProjectDescription/TargetDependency.swift b/Sources/ProjectDescription/TargetDependency.swift index ca092d32c..d5f8872a5 100644 --- a/Sources/ProjectDescription/TargetDependency.swift +++ b/Sources/ProjectDescription/TargetDependency.swift @@ -3,12 +3,11 @@ import Foundation // MARK: - TargetDependency public enum TargetDependency: Codable { - case target(name: String) case project(target: String, path: String) case framework(path: String) case library(path: String, publicHeaders: String, swiftModuleMap: String?) - + public var typeName: String { switch self { case .target: @@ -21,17 +20,15 @@ public enum TargetDependency: Codable { return "library" } } - } // MARK: - TargetDependency (Coding) extension TargetDependency { - public enum CodingError: Error { case unknownType(String) } - + public enum CodingKeys: String, CodingKey { case type case name @@ -40,55 +37,54 @@ extension TargetDependency { case publicHeaders case swiftModuleMap } - + public init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) - + let type = try container.decode(String.self, forKey: .type) - + switch type { case "target": self = .target(name: try container.decode(String.self, forKey: .name)) - + case "project": self = .project( target: try container.decode(String.self, forKey: .target), path: try container.decode(String.self, forKey: .path) ) - + case "framework": self = .framework(path: try container.decode(String.self, forKey: .path)) - + case "library": self = .library( path: try container.decode(String.self, forKey: .path), publicHeaders: try container.decode(String.self, forKey: .publicHeaders), swiftModuleMap: try container.decodeIfPresent(String.self, forKey: .swiftModuleMap) ) - + default: throw CodingError.unknownType(type) } } - + public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) - - try container.encode(self.typeName, forKey: .type) - + + try container.encode(typeName, forKey: .type) + switch self { - case .target(name: let name): + case let .target(name: name): try container.encode(name, forKey: .name) - case .project(target: let target, path: let path): + case let .project(target: target, path: path): try container.encode(target, forKey: .target) try container.encode(path, forKey: .path) - case .framework(path: let path): + case let .framework(path: path): try container.encode(path, forKey: .path) - case .library(path: let path, publicHeaders: let publicHeaders, swiftModuleMap: let swiftModuleMap): + case let .library(path: path, publicHeaders: publicHeaders, swiftModuleMap: swiftModuleMap): try container.encode(path, forKey: .path) try container.encode(publicHeaders, forKey: .publicHeaders) try container.encodeIfPresent(swiftModuleMap, forKey: .swiftModuleMap) } } - } diff --git a/Sources/ProjectDescription/Workspace.swift b/Sources/ProjectDescription/Workspace.swift index 81b327f91..0cedd38bd 100644 --- a/Sources/ProjectDescription/Workspace.swift +++ b/Sources/ProjectDescription/Workspace.swift @@ -3,12 +3,11 @@ import Foundation // MARK: - Workspace public class Workspace: Codable { - enum CodingKeys: String, CodingKey { case name case projects = "project" } - + public let name: String public let projects: [String] public init(name: String, diff --git a/Tests/ProjectDescriptionTests/ProductTests.swift b/Tests/ProjectDescriptionTests/ProductTests.swift index 5eb078ff1..eb875a9bd 100644 --- a/Tests/ProjectDescriptionTests/ProductTests.swift +++ b/Tests/ProjectDescriptionTests/ProductTests.swift @@ -5,19 +5,19 @@ import XCTest final class ProductTests: XCTestCase { func test_toJSON() { assertCodableEqualToJson([Product.app], "[\"app\"]") - assertCodableEqualToJson([Product.staticLibrary],"[\"staticLibrary\"]") - assertCodableEqualToJson([Product.dynamicLibrary],"[\"dynamicLibrary\"]") - assertCodableEqualToJson([Product.framework],"[\"framework\"]") - assertCodableEqualToJson([Product.unitTests],"[\"unitTests\"]") - assertCodableEqualToJson([Product.uiTests],"[\"uiTests\"]") - assertCodableEqualToJson([Product.appExtension],"[\"appExtension\"]") - assertCodableEqualToJson([Product.watchApp],"[\"watchApp\"]") - assertCodableEqualToJson([Product.watch2App],"[\"watch2App\"]") - assertCodableEqualToJson([Product.watchExtension],"[\"watchExtension\"]") - assertCodableEqualToJson([Product.watch2Extension],"[\"watch2Extension\"]") - assertCodableEqualToJson([Product.tvExtension],"[\"tvExtension\"]") - assertCodableEqualToJson([Product.messagesApplication],"[\"messagesApplication\"]") - assertCodableEqualToJson([Product.messagesExtension],"[\"messagesExtension\"]") - assertCodableEqualToJson([Product.stickerPack],"[\"stickerPack\"]") + assertCodableEqualToJson([Product.staticLibrary], "[\"staticLibrary\"]") + assertCodableEqualToJson([Product.dynamicLibrary], "[\"dynamicLibrary\"]") + assertCodableEqualToJson([Product.framework], "[\"framework\"]") + assertCodableEqualToJson([Product.unitTests], "[\"unitTests\"]") + assertCodableEqualToJson([Product.uiTests], "[\"uiTests\"]") + assertCodableEqualToJson([Product.appExtension], "[\"appExtension\"]") + assertCodableEqualToJson([Product.watchApp], "[\"watchApp\"]") + assertCodableEqualToJson([Product.watch2App], "[\"watch2App\"]") + assertCodableEqualToJson([Product.watchExtension], "[\"watchExtension\"]") + assertCodableEqualToJson([Product.watch2Extension], "[\"watch2Extension\"]") + assertCodableEqualToJson([Product.tvExtension], "[\"tvExtension\"]") + assertCodableEqualToJson([Product.messagesApplication], "[\"messagesApplication\"]") + assertCodableEqualToJson([Product.messagesExtension], "[\"messagesExtension\"]") + assertCodableEqualToJson([Product.stickerPack], "[\"stickerPack\"]") } } diff --git a/Tests/ProjectDescriptionTests/assertCodableEqualToJson.swift b/Tests/ProjectDescriptionTests/assertCodableEqualToJson.swift index e83432c45..c947e5c2f 100644 --- a/Tests/ProjectDescriptionTests/assertCodableEqualToJson.swift +++ b/Tests/ProjectDescriptionTests/assertCodableEqualToJson.swift @@ -9,6 +9,6 @@ func assertCodableEqualToJson(_ subject: C, _ json: String) { encoder.keyEncodingStrategy = .convertToSnakeCase let jsonData = try! encoder.encode(decoded) let subjectData = try! encoder.encode(subject) - + XCTAssert(jsonData == subjectData, "JSON does not match the encoded \(String(describing: subject))") }