From d95d7ccc464d54bd75d220984bc3ce4940c7b99d Mon Sep 17 00:00:00 2001 From: Ben Wetherfield Date: Mon, 15 Jul 2019 15:43:23 -0700 Subject: [PATCH 1/6] Add benchmarking data --- ...726F61F1-369A-4FE6-9D1D-BEC88E5CB1DC.plist | 232 ++++++++++++++++++ .../Info.plist | 24 ++ 2 files changed, 256 insertions(+) create mode 100644 XMLCoder.xcodeproj/xcshareddata/xcbaselines/XMLCoder::XMLCoderTests.xcbaseline/726F61F1-369A-4FE6-9D1D-BEC88E5CB1DC.plist diff --git a/XMLCoder.xcodeproj/xcshareddata/xcbaselines/XMLCoder::XMLCoderTests.xcbaseline/726F61F1-369A-4FE6-9D1D-BEC88E5CB1DC.plist b/XMLCoder.xcodeproj/xcshareddata/xcbaselines/XMLCoder::XMLCoderTests.xcbaseline/726F61F1-369A-4FE6-9D1D-BEC88E5CB1DC.plist new file mode 100644 index 00000000..9f3b9f2c --- /dev/null +++ b/XMLCoder.xcodeproj/xcshareddata/xcbaselines/XMLCoder::XMLCoderTests.xcbaseline/726F61F1-369A-4FE6-9D1D-BEC88E5CB1DC.plist @@ -0,0 +1,232 @@ + + + + + classNames + + BenchmarkTests + + testDecodeArrays() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.45609 + baselineIntegrationDisplayName + Local Baseline + + + testDecodeBools() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.064437 + baselineIntegrationDisplayName + Local Baseline + + + testDecodeDatas() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.083191 + baselineIntegrationDisplayName + Local Baseline + + + testDecodeDates() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.061247 + baselineIntegrationDisplayName + Local Baseline + + + testDecodeDecimals() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.049022 + baselineIntegrationDisplayName + Local Baseline + + + testDecodeDictionaries() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.22164 + baselineIntegrationDisplayName + Local Baseline + + + testDecodeFloats() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.0426 + baselineIntegrationDisplayName + Local Baseline + + + testDecodeInts() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.040157 + baselineIntegrationDisplayName + Local Baseline + + + testDecodeNulls() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.031343 + baselineIntegrationDisplayName + Local Baseline + + + testDecodeUInts() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.041441 + baselineIntegrationDisplayName + Local Baseline + + + testDecodeURLs() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.047946 + baselineIntegrationDisplayName + Local Baseline + + + testEncodeArrays() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.088624 + baselineIntegrationDisplayName + Local Baseline + + + testEncodeBools() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.016727 + baselineIntegrationDisplayName + Local Baseline + + + testEncodeDatas() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.022805 + baselineIntegrationDisplayName + Local Baseline + + + testEncodeDates() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.02052 + baselineIntegrationDisplayName + Local Baseline + + + testEncodeDecimals() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.016909 + baselineIntegrationDisplayName + Local Baseline + + + testEncodeDictionaries() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.11651 + baselineIntegrationDisplayName + Local Baseline + + + testEncodeFloats() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.018687 + baselineIntegrationDisplayName + Local Baseline + + + testEncodeInts() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.017093 + baselineIntegrationDisplayName + Local Baseline + + + testEncodeNulls() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.0073608 + baselineIntegrationDisplayName + Local Baseline + + + testEncodeUInts() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.017129 + baselineIntegrationDisplayName + Local Baseline + + + testEncodeURLs() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.020648 + baselineIntegrationDisplayName + Local Baseline + + + + + + diff --git a/XMLCoder.xcodeproj/xcshareddata/xcbaselines/XMLCoder::XMLCoderTests.xcbaseline/Info.plist b/XMLCoder.xcodeproj/xcshareddata/xcbaselines/XMLCoder::XMLCoderTests.xcbaseline/Info.plist index 2a9e9b9f..ef4ca520 100644 --- a/XMLCoder.xcodeproj/xcshareddata/xcbaselines/XMLCoder::XMLCoderTests.xcbaseline/Info.plist +++ b/XMLCoder.xcodeproj/xcshareddata/xcbaselines/XMLCoder::XMLCoderTests.xcbaseline/Info.plist @@ -4,6 +4,30 @@ runDestinationsByUUID + 726F61F1-369A-4FE6-9D1D-BEC88E5CB1DC + + localComputer + + busSpeedInMHz + 100 + cpuCount + 1 + cpuKind + Intel Core i5 + cpuSpeedInMHz + 3100 + logicalCPUCoresPerPackage + 4 + modelCode + MacBookPro14,2 + physicalCPUCoresPerPackage + 2 + platformIdentifier + com.apple.platform.macosx + + targetArchitecture + x86_64 + 76E090BF-7AFE-4988-A06A-3C423396A4A4 localComputer From feb26d1a2bff31f37ebadc2d7b71abce15105a6c Mon Sep 17 00:00:00 2001 From: Ben Wetherfield Date: Mon, 15 Jul 2019 19:48:48 -0700 Subject: [PATCH 2/6] Add containsChoice juncture for Unboxed key encoding --- Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift | 6 ++++++ Sources/XMLCoder/Encoder/XMLEncoder.swift | 6 +++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift b/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift index acc800a8..a4233ff8 100644 --- a/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift +++ b/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift @@ -244,6 +244,12 @@ struct XMLCoderElement: Equatable { // MARK: - Convenience Initializers extension XMLCoderElement { + static func containsChoice(key: String, box: UnkeyedBox) -> XMLCoderElement { + return XMLCoderElement(key: key, elements: box.map { + XMLCoderElement(key: "", box: $0) + }) + } + init(key: String, box: UnkeyedBox) { self.init(key: key, elements: box.map { XMLCoderElement(key: key, box: $0) diff --git a/Sources/XMLCoder/Encoder/XMLEncoder.swift b/Sources/XMLCoder/Encoder/XMLEncoder.swift index 7ba007b2..0f4a3104 100644 --- a/Sources/XMLCoder/Encoder/XMLEncoder.swift +++ b/Sources/XMLCoder/Encoder/XMLEncoder.swift @@ -337,7 +337,11 @@ open class XMLEncoder { if let keyedBox = topLevel as? KeyedBox { elementOrNone = XMLCoderElement(key: rootKey, box: keyedBox) } else if let unkeyedBox = topLevel as? UnkeyedBox { - elementOrNone = XMLCoderElement(key: rootKey, box: unkeyedBox) + if T.self is XMLChoiceEncodable.Type { + elementOrNone = XMLCoderElement.containsChoice(key: rootKey, box: unkeyedBox) + } else { + elementOrNone = XMLCoderElement(key: rootKey, box: unkeyedBox) + } } else { fatalError("Unrecognized top-level element of type: \(type(of: topLevel))") } From 027bcb921ad510d334bee27d6f7591e36eaae5c1 Mon Sep 17 00:00:00 2001 From: Ben Wetherfield Date: Mon, 15 Jul 2019 19:57:53 -0700 Subject: [PATCH 3/6] Add Array containing XMLChoiceEncodable type --- Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift | 4 +++- Sources/XMLCoder/Encoder/XMLChoiceEncodable.swift | 4 ++++ Sources/XMLCoder/Encoder/XMLEncoder.swift | 2 +- Tests/XMLCoderTests/SimpleChoiceTests.swift | 1 + 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift b/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift index a4233ff8..c4a18662 100644 --- a/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift +++ b/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift @@ -226,7 +226,9 @@ struct XMLCoderElement: Equatable { string += "" } } else if !elements.isEmpty { - string += prettyPrinted ? ">\n" : ">" + if !key.isEmpty { + string += prettyPrinted ? ">\n" : ">" + } formatXMLElements(formatting, &string, level, cdata, prettyPrinted) string += indentation diff --git a/Sources/XMLCoder/Encoder/XMLChoiceEncodable.swift b/Sources/XMLCoder/Encoder/XMLChoiceEncodable.swift index 81a37b83..2186255a 100644 --- a/Sources/XMLCoder/Encoder/XMLChoiceEncodable.swift +++ b/Sources/XMLCoder/Encoder/XMLChoiceEncodable.swift @@ -6,3 +6,7 @@ // public protocol XMLChoiceEncodable: Encodable {} + +public protocol ArrayOfXMLChoiceEncodable {} + +extension Array: ArrayOfXMLChoiceEncodable where Element: XMLChoiceEncodable {} diff --git a/Sources/XMLCoder/Encoder/XMLEncoder.swift b/Sources/XMLCoder/Encoder/XMLEncoder.swift index 0f4a3104..94788070 100644 --- a/Sources/XMLCoder/Encoder/XMLEncoder.swift +++ b/Sources/XMLCoder/Encoder/XMLEncoder.swift @@ -337,7 +337,7 @@ open class XMLEncoder { if let keyedBox = topLevel as? KeyedBox { elementOrNone = XMLCoderElement(key: rootKey, box: keyedBox) } else if let unkeyedBox = topLevel as? UnkeyedBox { - if T.self is XMLChoiceEncodable.Type { + if T.self is ArrayOfXMLChoiceEncodable.Type { elementOrNone = XMLCoderElement.containsChoice(key: rootKey, box: unkeyedBox) } else { elementOrNone = XMLCoderElement(key: rootKey, box: unkeyedBox) diff --git a/Tests/XMLCoderTests/SimpleChoiceTests.swift b/Tests/XMLCoderTests/SimpleChoiceTests.swift index 34bd4974..66e1d83f 100644 --- a/Tests/XMLCoderTests/SimpleChoiceTests.swift +++ b/Tests/XMLCoderTests/SimpleChoiceTests.swift @@ -93,6 +93,7 @@ class SimpleChoiceTests: XCTestCase { .int(5), ] let encoded = try XMLEncoder().encode(original, withRootKey: "container") + print(String(data: encoded, encoding: .utf8)) let decoded = try XMLDecoder().decode([IntOrString].self, from: encoded) XCTAssertEqual(original, decoded) } From b0e6ddfae90ee28b3eb2d56369135faef48103ea Mon Sep 17 00:00:00 2001 From: Ben Wetherfield Date: Mon, 15 Jul 2019 19:58:55 -0700 Subject: [PATCH 4/6] Remove stray print statement --- Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift | 2 +- Tests/XMLCoderTests/CompositeChoiceTests.swift | 4 +--- Tests/XMLCoderTests/SimpleChoiceTests.swift | 3 --- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift b/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift index c4a18662..917f97e1 100644 --- a/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift +++ b/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift @@ -251,7 +251,7 @@ extension XMLCoderElement { XMLCoderElement(key: "", box: $0) }) } - + init(key: String, box: UnkeyedBox) { self.init(key: key, elements: box.map { XMLCoderElement(key: key, box: $0) diff --git a/Tests/XMLCoderTests/CompositeChoiceTests.swift b/Tests/XMLCoderTests/CompositeChoiceTests.swift index 2c58982e..c941805c 100644 --- a/Tests/XMLCoderTests/CompositeChoiceTests.swift +++ b/Tests/XMLCoderTests/CompositeChoiceTests.swift @@ -22,7 +22,6 @@ private enum IntOrStringWrapper: Equatable { } extension IntOrStringWrapper: XMLChoiceCodable { - enum CodingKeys: String, CodingKey { case int case string @@ -38,7 +37,7 @@ extension IntOrStringWrapper: XMLChoiceCodable { } func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) + var container = encoder.container(keyedBy: CodingKeys.self) switch self { case let .int(value): try container.encode(value, forKey: .int) @@ -49,7 +48,6 @@ extension IntOrStringWrapper: XMLChoiceCodable { } class CompositeChoiceTests: XCTestCase { - func testIntOrStringWrapper() throws { let xml = """ diff --git a/Tests/XMLCoderTests/SimpleChoiceTests.swift b/Tests/XMLCoderTests/SimpleChoiceTests.swift index 66e1d83f..edccd9e7 100644 --- a/Tests/XMLCoderTests/SimpleChoiceTests.swift +++ b/Tests/XMLCoderTests/SimpleChoiceTests.swift @@ -14,7 +14,6 @@ private enum IntOrString: Equatable { } extension IntOrString: XMLChoiceCodable { - enum CodingKeys: String, CodingKey { case int case string @@ -41,7 +40,6 @@ extension IntOrString: XMLChoiceCodable { } class SimpleChoiceTests: XCTestCase { - func testIntOrStringIntDecoding() throws { let xml = "42" let result = try XMLDecoder().decode(IntOrString.self, from: xml.data(using: .utf8)!) @@ -93,7 +91,6 @@ class SimpleChoiceTests: XCTestCase { .int(5), ] let encoded = try XMLEncoder().encode(original, withRootKey: "container") - print(String(data: encoded, encoding: .utf8)) let decoded = try XMLDecoder().decode([IntOrString].self, from: encoded) XCTAssertEqual(original, decoded) } From 22d1a9c2adeb0950c637ae63900b883230421095 Mon Sep 17 00:00:00 2001 From: Ben Wetherfield Date: Mon, 15 Jul 2019 20:04:18 -0700 Subject: [PATCH 5/6] Add fix for pretty printing --- Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift b/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift index 917f97e1..85f209c4 100644 --- a/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift +++ b/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift @@ -103,10 +103,13 @@ struct XMLCoderElement: Equatable { prettyPrinted: Bool ) -> String { var string = "" + // Fix added for empty key adjustment in `UnkeyedBox` taking static func builder + let nonEmptyKey = element.key != "" + let level = nonEmptyKey ? level + 1 : level string += element._toXMLString( indented: level + 1, withCDATA: cdata, formatting: formatting ) - string += prettyPrinted ? "\n" : "" + string += (prettyPrinted && nonEmptyKey) ? "\n" : "" return string } From fc29bd4d391e9598a46f8a9bc0c3b8b6738d05b5 Mon Sep 17 00:00:00 2001 From: Ben Wetherfield Date: Mon, 15 Jul 2019 22:13:37 -0700 Subject: [PATCH 6/6] Fix typo --- Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift b/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift index 85f209c4..97d43e78 100644 --- a/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift +++ b/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift @@ -107,7 +107,7 @@ struct XMLCoderElement: Equatable { let nonEmptyKey = element.key != "" let level = nonEmptyKey ? level + 1 : level string += element._toXMLString( - indented: level + 1, withCDATA: cdata, formatting: formatting + indented: level, withCDATA: cdata, formatting: formatting ) string += (prettyPrinted && nonEmptyKey) ? "\n" : "" return string