From 36384e66555143b73e390b4e49abbe041b156a1e Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Mon, 1 Jun 2020 19:20:38 +0100 Subject: [PATCH 1/7] Make character escaping customizable in XMLEncoder --- .vscode/settings.json | 1 + .../Auxiliaries/XMLCoderElement.swift | 70 ++++++------ Sources/XMLCoder/Encoder/XMLEncoder.swift | 22 ++++ .../XMLCoderTests/EscapedCharactersTest.swift | 103 ++++++++++++++++++ Tests/XMLCoderTests/QuoteDecodingTest.swift | 52 --------- Tests/XMLCoderTests/XCTestManifests.swift | 23 ++-- 6 files changed, 170 insertions(+), 101 deletions(-) create mode 100644 Tests/XMLCoderTests/EscapedCharactersTest.swift delete mode 100644 Tests/XMLCoderTests/QuoteDecodingTest.swift diff --git a/.vscode/settings.json b/.vscode/settings.json index 7d009e00..39921a07 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,5 @@ { "licenser.license": "MIT", "licenser.author": "XMLCoder contributors", + "editor.formatOnSave": true, } diff --git a/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift b/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift index 0b6fe835..c8715610 100644 --- a/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift +++ b/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift @@ -14,15 +14,6 @@ struct Attribute: Equatable { } struct XMLCoderElement: Equatable { - private static let attributesKey = "___ATTRIBUTES" - private static let escapedCharacterSet = [ - ("&", "&"), - ("<", "<"), - (">", ">"), - ("'", "'"), - ("\"", """), - ] - let key: String private(set) var stringValue: String? private(set) var elements: [XMLCoderElement] = [] @@ -124,18 +115,20 @@ struct XMLCoderElement: Equatable { func toXMLString( with header: XMLHeader? = nil, + escapedCharacters: (elements: [(String, String)], attributes: [(String, String)]), formatting: XMLEncoder.OutputFormatting, indentation: XMLEncoder.PrettyPrintIndentation ) -> String { if let header = header, let headerXML = header.toXML() { - return headerXML + _toXMLString(formatting, indentation) + return headerXML + _toXMLString(escapedCharacters, formatting, indentation) } - return _toXMLString(formatting, indentation) + return _toXMLString(escapedCharacters, formatting, indentation) } private func formatUnsortedXMLElements( _ string: inout String, _ level: Int, + _ escapedCharacters: (elements: [(String, String)], attributes: [(String, String)]), _ formatting: XMLEncoder.OutputFormatting, _ indentation: XMLEncoder.PrettyPrintIndentation, _ prettyPrinted: Bool @@ -144,6 +137,7 @@ struct XMLCoderElement: Equatable { from: elements, into: &string, at: level, + escapedCharacters: escapedCharacters, formatting: formatting, indentation: indentation, prettyPrinted: prettyPrinted @@ -155,18 +149,19 @@ struct XMLCoderElement: Equatable { at level: Int, formatting: XMLEncoder.OutputFormatting, indentation: XMLEncoder.PrettyPrintIndentation, + escapedCharacters: (elements: [(String, String)], attributes: [(String, String)]), prettyPrinted: Bool ) -> String { if let stringValue = element.stringValue { if element.isCDATANode { return "" } else { - return stringValue.escape(XMLCoderElement.escapedCharacterSet) + return stringValue.escape(escapedCharacters.elements) } } var string = "" - string += element._toXMLString(indented: level + 1, formatting, indentation) + string += element._toXMLString(indented: level + 1, escapedCharacters, formatting, indentation) string += prettyPrinted ? "\n" : "" return string } @@ -174,6 +169,7 @@ struct XMLCoderElement: Equatable { fileprivate func formatSortedXMLElements( _ string: inout String, _ level: Int, + _ escapedCharacters: (elements: [(String, String)], attributes: [(String, String)]), _ formatting: XMLEncoder.OutputFormatting, _ indentation: XMLEncoder.PrettyPrintIndentation, _ prettyPrinted: Bool @@ -181,21 +177,19 @@ struct XMLCoderElement: Equatable { formatXMLElements(from: elements.sorted { $0.key < $1.key }, into: &string, at: level, + escapedCharacters: escapedCharacters, formatting: formatting, indentation: indentation, prettyPrinted: prettyPrinted) } - fileprivate func attributeString(key: String, value: String) -> String { - return " \(key)=\"\(value.escape(XMLCoderElement.escapedCharacterSet))\"" - } - fileprivate func formatXMLAttributes( from attributes: [Attribute], - into string: inout String + into string: inout String, + charactersEscapedInAttributes: [(String, String)] ) { for attribute in attributes { - string += attributeString(key: attribute.key, value: attribute.value) + string += " \(attribute.key)=\"\(attribute.value.escape(charactersEscapedInAttributes))\"" } } @@ -203,6 +197,7 @@ struct XMLCoderElement: Equatable { from elements: [XMLCoderElement], into string: inout String, at level: Int, + escapedCharacters: (elements: [(String, String)], attributes: [(String, String)]), formatting: XMLEncoder.OutputFormatting, indentation: XMLEncoder.PrettyPrintIndentation, prettyPrinted: Bool @@ -212,32 +207,28 @@ struct XMLCoderElement: Equatable { at: level, formatting: formatting, indentation: indentation, + escapedCharacters: escapedCharacters, prettyPrinted: prettyPrinted && !containsTextNodes) } } - fileprivate func formatSortedXMLAttributes(_ string: inout String) { - formatXMLAttributes( - from: attributes.sorted(by: { $0.key < $1.key }), into: &string - ) - } - - fileprivate func formatUnsortedXMLAttributes(_ string: inout String) { - formatXMLAttributes(from: attributes, into: &string) - } - private func formatXMLAttributes( _ formatting: XMLEncoder.OutputFormatting, - _ string: inout String + _ string: inout String, + _ charactersEscapedInAttributes: [(String, String)] ) { - if formatting.contains(.sortedKeys) { - formatSortedXMLAttributes(&string) - return - } - formatUnsortedXMLAttributes(&string) + let attributes = formatting.contains(.sortedKeys) ? + self.attributes.sorted(by: { $0.key < $1.key }) : + self.attributes + formatXMLAttributes( + from: attributes, + into: &string, + charactersEscapedInAttributes: charactersEscapedInAttributes + ) } private func formatXMLElements( + _ escapedCharacters: (elements: [(String, String)], attributes: [(String, String)]), _ formatting: XMLEncoder.OutputFormatting, _ indentation: XMLEncoder.PrettyPrintIndentation, _ string: inout String, @@ -246,17 +237,18 @@ struct XMLCoderElement: Equatable { ) { if formatting.contains(.sortedKeys) { formatSortedXMLElements( - &string, level, formatting, indentation, prettyPrinted + &string, level, escapedCharacters, formatting, indentation, prettyPrinted ) return } formatUnsortedXMLElements( - &string, level, formatting, indentation, prettyPrinted + &string, level, escapedCharacters, formatting, indentation, prettyPrinted ) } private func _toXMLString( indented level: Int = 0, + _ escapedCharacters: (elements: [(String, String)], attributes: [(String, String)]), _ formatting: XMLEncoder.OutputFormatting, _ indentation: XMLEncoder.PrettyPrintIndentation ) -> String { @@ -276,14 +268,14 @@ struct XMLCoderElement: Equatable { string += "<\(key)" } - formatXMLAttributes(formatting, &string) + formatXMLAttributes(formatting, &string, escapedCharacters.attributes) if !elements.isEmpty { let prettyPrintElements = prettyPrinted && !containsTextNodes if !key.isEmpty { string += prettyPrintElements ? ">\n" : ">" } - formatXMLElements(formatting, indentation, &string, level, prettyPrintElements) + formatXMLElements(escapedCharacters, formatting, indentation, &string, level, prettyPrintElements) if prettyPrintElements { string += prefix } if !key.isEmpty { diff --git a/Sources/XMLCoder/Encoder/XMLEncoder.swift b/Sources/XMLCoder/Encoder/XMLEncoder.swift index acdd1fe9..40bd665c 100644 --- a/Sources/XMLCoder/Encoder/XMLEncoder.swift +++ b/Sources/XMLCoder/Encoder/XMLEncoder.swift @@ -267,6 +267,24 @@ open class XMLEncoder { } } + /// Characters and their escaped representations to be escaped in attributes + open var charactersEscapedInAttributes = [ + ("&", "&"), + ("<", "<"), + (">", ">"), + ("'", "'"), + ("\"", """), + ] + + /// Characters and their escaped representations to be escaped in elements + open var charactersEscapedInElements = [ + ("&", "&"), + ("<", "<"), + (">", ">"), + ("'", "'"), + ("\"", """), + ] + /// The output format to produce. Defaults to `[]`. open var outputFormatting: OutputFormatting = [] @@ -384,6 +402,10 @@ open class XMLEncoder { return element.toXMLString( with: header, + escapedCharacters: ( + attributes: charactersEscapedInAttributes, + elements: charactersEscapedInElements + ), formatting: outputFormatting, indentation: prettyPrintIndentation ).data(using: .utf8, allowLossyConversion: true)! diff --git a/Tests/XMLCoderTests/EscapedCharactersTest.swift b/Tests/XMLCoderTests/EscapedCharactersTest.swift new file mode 100644 index 00000000..d5940708 --- /dev/null +++ b/Tests/XMLCoderTests/EscapedCharactersTest.swift @@ -0,0 +1,103 @@ +// Copyright (c) 2019-2020 XMLCoder contributors +// +// This software is released under the MIT License. +// https://opensource.org/licenses/MIT +// +// Created by Max Desiatov on 05/10/2019. +// + +import Foundation +import XCTest +@testable import XMLCoder + +private let xml = + """ + + <uesb2b:response + xmlns:uesb2b="http://services.b2b.ues.ut.uhg.com/types/plans/" + xmlns="http://services.b2b.ues.ut.uhg.com/types/plans/"> + <uesb2b:st cd="GA" /> + <uesb2b:obligId val="01" /> + <uesb2b:shrArrangementId val="00" /> + <uesb2b:busInsType val="CG" /> + <uesb2b:metalPlans typ="Array" + + + """.data(using: .utf8)! + +private let expectedResponse = + """ + \r + \r + \r + \r + \r + "# + +private struct Attribute: Codable, DynamicNodeEncoding, Equatable { + let id: String + + static func nodeEncoding(for key: CodingKey) -> XMLEncoder.NodeEncoding { + return .attribute + } +} + +final class EscapedCharactersTest: XCTestCase { + func testDefaultDecoding() throws { + let decoder = XMLDecoder() + decoder.trimValueWhitespaces = false + let response = try decoder.decode(Response.self, from: xml).aResponse + XCTAssertEqual(response, expectedResponse) + } + + func testDefaultEncoding() throws { + let encoder = XMLEncoder() + let result = try String( + data: encoder.encode(Response(aResponse: #" """ "#)), + encoding: .utf8 + )! + XCTAssertEqual(result, " """ ") + } + + func testQuoteEncoding() throws { + let encoder = XMLEncoder() + encoder.charactersEscapedInElements = [] + let result = try String( + data: encoder.encode(Response(aResponse: #" """ "#)), + encoding: .utf8 + )! + XCTAssertEqual(result, #" """ "#) + } + + func testNewlineAttributeEncoding() throws { + let decoder = XMLDecoder() + decoder.trimValueWhitespaces = false + XCTAssertEqual( + try decoder.decode(Attribute.self, from: attributeNewlineEncoded.data(using: .utf8)!), + attributeNewline + ) + + let encoder = XMLEncoder() + encoder.charactersEscapedInAttributes += [("\n", " ")] + let result = try String(data: encoder.encode(attributeNewline), encoding: .utf8)! + XCTAssertEqual(result, attributeNewlineEncoded) + } +} diff --git a/Tests/XMLCoderTests/QuoteDecodingTest.swift b/Tests/XMLCoderTests/QuoteDecodingTest.swift deleted file mode 100644 index 56fd9132..00000000 --- a/Tests/XMLCoderTests/QuoteDecodingTest.swift +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright (c) 2019-2020 XMLCoder contributors -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT -// -// Created by Max Desiatov on 05/10/2019. -// - -import Foundation -import XCTest -@testable import XMLCoder - -private let xml = - """ - - <uesb2b:response - xmlns:uesb2b="http://services.b2b.ues.ut.uhg.com/types/plans/" - xmlns="http://services.b2b.ues.ut.uhg.com/types/plans/"> - <uesb2b:st cd="GA" /> - <uesb2b:obligId val="01" /> - <uesb2b:shrArrangementId val="00" /> - <uesb2b:busInsType val="CG" /> - <uesb2b:metalPlans typ="Array" - - - """.data(using: .utf8)! - -private let expectedResponse = - """ - \r - \r - \r - \r - \r - [XCTestCaseEntry] { testCase(EmptyTests.__allTests__EmptyTests), testCase(EnumAssociatedValueTestComposite.__allTests__EnumAssociatedValueTestComposite), testCase(ErrorContextTest.__allTests__ErrorContextTest), + testCase(EscapedCharactersTest.__allTests__EscapedCharactersTest), testCase(FloatBoxTests.__allTests__FloatBoxTests), testCase(FloatTests.__allTests__FloatTests), testCase(IntBoxTests.__allTests__IntBoxTests), @@ -911,7 +915,6 @@ public func __allTests() -> [XCTestCaseEntry] { testCase(OptionalTests.__allTests__OptionalTests), testCase(PlantTest.__allTests__PlantTest), testCase(PrettyPrintTest.__allTests__PrettyPrintTest), - testCase(QuoteDecodingTest.__allTests__QuoteDecodingTest), testCase(RJITest.__allTests__RJITest), testCase(RelationshipsTest.__allTests__RelationshipsTest), testCase(RootLevelAttributeTest.__allTests__RootLevelAttributeTest), From 23174ae6aeddaefea6731403d14c225501dba351 Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Mon, 1 Jun 2020 19:26:30 +0100 Subject: [PATCH 2/7] Fix Xcode project file --- XMLCoder.xcodeproj/project.pbxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/XMLCoder.xcodeproj/project.pbxproj b/XMLCoder.xcodeproj/project.pbxproj index 44db9194..b921635d 100644 --- a/XMLCoder.xcodeproj/project.pbxproj +++ b/XMLCoder.xcodeproj/project.pbxproj @@ -29,7 +29,7 @@ B5F74472233F74E400BBDB15 /* RootLevelAttributeTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5F74471233F74E400BBDB15 /* RootLevelAttributeTest.swift */; }; D11E094623491BCE00C24DCB /* DoubleBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = D11E094523491BCE00C24DCB /* DoubleBox.swift */; }; D11E094A234924C500C24DCB /* ValueBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = D11E0949234924C500C24DCB /* ValueBox.swift */; }; - D18FBFB82348FAE500FA4F65 /* QuoteDecodingTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D18FBFB72348FAE500FA4F65 /* QuoteDecodingTest.swift */; }; + D18FBFB82348FAE500FA4F65 /* EscapedCharactersTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D18FBFB72348FAE500FA4F65 /* EscapedCharactersTest.swift */; }; D1A1838524842C980058E66D /* PrettyPrintTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1A1838024842C7D0058E66D /* PrettyPrintTest.swift */; }; D1A1838624842C9E0058E66D /* CDATATest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1A1838324842C920058E66D /* CDATATest.swift */; }; D1A183B524842DE10058E66D /* CDCatalog.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1A1839424842D710058E66D /* CDCatalog.swift */; }; @@ -173,7 +173,7 @@ B5F74471233F74E400BBDB15 /* RootLevelAttributeTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootLevelAttributeTest.swift; sourceTree = ""; }; D11E094523491BCE00C24DCB /* DoubleBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DoubleBox.swift; sourceTree = ""; }; D11E0949234924C500C24DCB /* ValueBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ValueBox.swift; sourceTree = ""; }; - D18FBFB72348FAE500FA4F65 /* QuoteDecodingTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuoteDecodingTest.swift; sourceTree = ""; }; + D18FBFB72348FAE500FA4F65 /* EscapedCharactersTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EscapedCharactersTest.swift; sourceTree = ""; }; D1A1838024842C7D0058E66D /* PrettyPrintTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PrettyPrintTest.swift; sourceTree = ""; }; D1A1838324842C920058E66D /* CDATATest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CDATATest.swift; sourceTree = ""; }; D1A1838824842D710058E66D /* DynamicNodeDecodingTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DynamicNodeDecodingTest.swift; sourceTree = ""; }; @@ -496,7 +496,7 @@ OBJ_114 /* NamespaceTest.swift */, OBJ_117 /* NestingTests.swift */, OBJ_118 /* NodeEncodingStrategyTests.swift */, - D18FBFB72348FAE500FA4F65 /* QuoteDecodingTest.swift */, + D18FBFB72348FAE500FA4F65 /* EscapedCharactersTest.swift */, B5F74471233F74E400BBDB15 /* RootLevelAttributeTest.swift */, 970FA9DB2422EFAE0023C1EC /* RootLevetExtraAttributesTests.swift */, OBJ_126 /* SingleChildTests.swift */, @@ -757,7 +757,7 @@ OBJ_214 /* XMLKeyTests.swift in Sources */, D1A183C824842DE80058E66D /* DynamicNodeEncodingTest.swift in Sources */, OBJ_215 /* XMLStackParserTests.swift in Sources */, - D18FBFB82348FAE500FA4F65 /* QuoteDecodingTest.swift in Sources */, + D18FBFB82348FAE500FA4F65 /* EscapedCharactersTest.swift in Sources */, D1A183C624842DE80058E66D /* NestedAttributeChoiceTests.swift in Sources */, OBJ_216 /* BenchmarkTests.swift in Sources */, D1A183CA24842DE80058E66D /* NestedChoiceArrayTest.swift in Sources */, From bc34fbd80063cd0e1ad2792a40fd7ca3a0904360 Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Mon, 1 Jun 2020 19:35:28 +0100 Subject: [PATCH 3/7] Attempt to fix issues with old Xcode versions --- Tests/XMLCoderTests/EscapedCharactersTest.swift | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Tests/XMLCoderTests/EscapedCharactersTest.swift b/Tests/XMLCoderTests/EscapedCharactersTest.swift index d5940708..e35fcfd7 100644 --- a/Tests/XMLCoderTests/EscapedCharactersTest.swift +++ b/Tests/XMLCoderTests/EscapedCharactersTest.swift @@ -42,15 +42,16 @@ private struct Response: Codable { let aResponse: String } -private let attributeNewline = Attribute(id: """ -Got an attributed String. -Will create a image. +private let attributeNewline = Attribute( + id: """ + Got an attributed String. + Will create a image. -""") + """ +) -private let attributeNewlineEncoded = - #""# +private let attributeNewlineEncoded = #""# private struct Attribute: Codable, DynamicNodeEncoding, Equatable { let id: String From a351b89f45d352d26eb5aac1365997905ab9cfc4 Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Mon, 1 Jun 2020 19:38:35 +0100 Subject: [PATCH 4/7] Avoid raw strings syntax not supported in Swift 4.2 --- Tests/XMLCoderTests/EscapedCharactersTest.swift | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Tests/XMLCoderTests/EscapedCharactersTest.swift b/Tests/XMLCoderTests/EscapedCharactersTest.swift index e35fcfd7..3b1bb0d9 100644 --- a/Tests/XMLCoderTests/EscapedCharactersTest.swift +++ b/Tests/XMLCoderTests/EscapedCharactersTest.swift @@ -51,7 +51,8 @@ private let attributeNewline = Attribute( """ ) -private let attributeNewlineEncoded = #""# +private let attributeNewlineEncoded = + "" private struct Attribute: Codable, DynamicNodeEncoding, Equatable { let id: String @@ -72,7 +73,7 @@ final class EscapedCharactersTest: XCTestCase { func testDefaultEncoding() throws { let encoder = XMLEncoder() let result = try String( - data: encoder.encode(Response(aResponse: #" """ "#)), + data: encoder.encode(Response(aResponse: " \"\"\" ")), encoding: .utf8 )! XCTAssertEqual(result, " """ ") @@ -82,10 +83,10 @@ final class EscapedCharactersTest: XCTestCase { let encoder = XMLEncoder() encoder.charactersEscapedInElements = [] let result = try String( - data: encoder.encode(Response(aResponse: #" """ "#)), + data: encoder.encode(Response(aResponse: " \"\"\" ")), encoding: .utf8 )! - XCTAssertEqual(result, #" """ "#) + XCTAssertEqual(result, " \"\"\" ") } func testNewlineAttributeEncoding() throws { From 1cf593b57387a58ff99c46b8ac0b42117c5103eb Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Mon, 1 Jun 2020 19:47:23 +0100 Subject: [PATCH 5/7] Make xcodebuild run tests in parallel --- XMLCoder.xcodeproj/xcshareddata/xcschemes/XMLCoder.xcscheme | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/XMLCoder.xcodeproj/xcshareddata/xcschemes/XMLCoder.xcscheme b/XMLCoder.xcodeproj/xcshareddata/xcschemes/XMLCoder.xcscheme index 59df07f8..fda885d8 100644 --- a/XMLCoder.xcodeproj/xcshareddata/xcschemes/XMLCoder.xcscheme +++ b/XMLCoder.xcodeproj/xcshareddata/xcschemes/XMLCoder.xcscheme @@ -26,10 +26,12 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - shouldUseLaunchSchemeArgsEnv = "YES"> + shouldUseLaunchSchemeArgsEnv = "YES" + codeCoverageEnabled = "YES"> + skipped = "NO" + parallelizable = "YES"> Date: Mon, 1 Jun 2020 19:48:56 +0100 Subject: [PATCH 6/7] Test with Xcode 11.5 on CI --- .github/workflows/main.yml | 88 ++++++++++++++++++++++---------------- 1 file changed, 50 insertions(+), 38 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 7248b5fd..e7830ae2 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -6,9 +6,9 @@ name: CI # events but only for the master branch on: push: - branches: [ master ] + branches: [master] pull_request: - branches: [ master ] + branches: [master] # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: @@ -18,70 +18,82 @@ jobs: # Steps represent a sequence of tasks that will be executed as part of the job steps: - # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v2 + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v2 - - name: Build with Xcode 11.0 - run: ./test_xcodebuild.sh Xcode_11 - env: - IOS_DEVICE: 'platform=iOS Simulator,OS=13.0,name=iPhone 8' - TVOS_DEVICE: 'platform=tvOS Simulator,OS=13.0,name=Apple TV 4K' + - name: Build with Xcode 11.0 + run: ./test_xcodebuild.sh Xcode_11 + env: + IOS_DEVICE: "platform=iOS Simulator,OS=13.0,name=iPhone 8" + TVOS_DEVICE: "platform=tvOS Simulator,OS=13.0,name=Apple TV 4K" xcode-11_1: runs-on: macOS-10.15 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v2 - - name: Build with Xcode 11.1 - run: ./test_xcodebuild.sh Xcode_11.1 - env: - IOS_DEVICE: 'platform=iOS Simulator,OS=13.1,name=iPhone 8' - TVOS_DEVICE: 'platform=tvOS Simulator,OS=13.0,name=Apple TV 4K' + - name: Build with Xcode 11.1 + run: ./test_xcodebuild.sh Xcode_11.1 + env: + IOS_DEVICE: "platform=iOS Simulator,OS=13.1,name=iPhone 8" + TVOS_DEVICE: "platform=tvOS Simulator,OS=13.0,name=Apple TV 4K" xcode-11_2: runs-on: macOS-10.15 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v2 - - name: Build with Xcode 11.2 - run: ./test_xcodebuild.sh Xcode_11.2 - env: - IOS_DEVICE: 'platform=iOS Simulator,OS=13.2.2,name=iPhone 8' - TVOS_DEVICE: 'platform=tvOS Simulator,OS=13.2,name=Apple TV 4K' + - name: Build with Xcode 11.2 + run: ./test_xcodebuild.sh Xcode_11.2 + env: + IOS_DEVICE: "platform=iOS Simulator,OS=13.2.2,name=iPhone 8" + TVOS_DEVICE: "platform=tvOS Simulator,OS=13.2,name=Apple TV 4K" xcode-11_3: runs-on: macOS-10.15 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v2 - - name: Build with Xcode 11.3 - run: ./test_xcodebuild.sh Xcode_11.3 - env: - IOS_DEVICE: 'platform=iOS Simulator,OS=13.3,name=iPhone 8' - TVOS_DEVICE: 'platform=tvOS Simulator,OS=13.3,name=Apple TV 4K' + - name: Build with Xcode 11.3 + run: ./test_xcodebuild.sh Xcode_11.3 + env: + IOS_DEVICE: "platform=iOS Simulator,OS=13.3,name=iPhone 8" + TVOS_DEVICE: "platform=tvOS Simulator,OS=13.3,name=Apple TV 4K" xcode-11_4: runs-on: macOS-10.15 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v2 - - name: Build with Xcode 11.4 - run: ./test_xcodebuild.sh Xcode_11.4 - env: - IOS_DEVICE: 'platform=iOS Simulator,OS=13.4,name=iPhone 8' - TVOS_DEVICE: 'platform=tvOS Simulator,OS=13.4,name=Apple TV 4K' - CODECOV_JOB: 'true' - CODECOV_TOKEN: ${{ secrets.codecovToken }} + - name: Build with Xcode 11.4 + run: ./test_xcodebuild.sh Xcode_11.4 + env: + IOS_DEVICE: "platform=iOS Simulator,OS=13.4,name=iPhone 8" + TVOS_DEVICE: "platform=tvOS Simulator,OS=13.4,name=Apple TV 4K" + + xcode-11_5: + runs-on: macOS-10.15 + + steps: + - uses: actions/checkout@v2 + + - name: Build with Xcode 11.5 + run: ./test_xcodebuild.sh Xcode_11.5 + env: + IOS_DEVICE: "platform=iOS Simulator,OS=13.5,name=iPhone 8" + TVOS_DEVICE: "platform=tvOS Simulator,OS=13.5,name=Apple TV 4K" + CODECOV_JOB: "true" + CODECOV_TOKEN: ${{ secrets.codecovToken }} pod-lib-lint: runs-on: macOS-10.15 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v2 - - name: Run CocoaPods linter - run: ./pod.sh + - name: Run CocoaPods linter + run: ./pod.sh From 4fef6fb8a4981b39a8fc60b17376777650fd38f4 Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Mon, 1 Jun 2020 20:03:59 +0100 Subject: [PATCH 7/7] Use tvOS 13.4 with Xcode 11.5 --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e7830ae2..e6f72047 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -85,7 +85,7 @@ jobs: run: ./test_xcodebuild.sh Xcode_11.5 env: IOS_DEVICE: "platform=iOS Simulator,OS=13.5,name=iPhone 8" - TVOS_DEVICE: "platform=tvOS Simulator,OS=13.5,name=Apple TV 4K" + TVOS_DEVICE: "platform=tvOS Simulator,OS=13.4,name=Apple TV 4K" CODECOV_JOB: "true" CODECOV_TOKEN: ${{ secrets.codecovToken }}