From 9de8190988b27d952ff52a639e5d977ecddc0d9c Mon Sep 17 00:00:00 2001 From: Yonas Kolb Date: Sat, 1 Sep 2018 19:21:20 +1000 Subject: [PATCH 1/9] upgrade Package to swift 4 --- Package.swift | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/Package.swift b/Package.swift index abda948..01cf4c6 100644 --- a/Package.swift +++ b/Package.swift @@ -1,10 +1,22 @@ -// swift-tools-version:3.1 +// swift-tools-version:4.0 import PackageDescription let package = Package( name: "Stencil", + products: [ + .library(name: "Stencil", targets: ["Stencil"]), + ], dependencies: [ - .Package(url: "https://github.com/kylef/PathKit.git", majorVersion: 0, minor: 9), - .Package(url: "https://github.com/kylef/Spectre.git", majorVersion: 0, minor: 8), + .package(url: "https://github.com/kylef/PathKit.git", from: "0.9.0"), + .package(url: "https://github.com/kylef/Spectre.git", from: "0.8.0"), + ], + targets: [ + .target(name: "Stencil", dependencies: [ + "PathKit", + ], path: "Sources"), + .testTarget(name: "StencilTests", dependencies: [ + "Stencil", + "Spectre", + ]) ] ) From 1098921dc822bb51a8b18ff842160cc5248c2667 Mon Sep 17 00:00:00 2001 From: Yonas Kolb Date: Sat, 1 Sep 2018 19:21:26 +1000 Subject: [PATCH 2/9] remove Swift 3 package --- Package@swift-3.swift | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 Package@swift-3.swift diff --git a/Package@swift-3.swift b/Package@swift-3.swift deleted file mode 100644 index 704b083..0000000 --- a/Package@swift-3.swift +++ /dev/null @@ -1,10 +0,0 @@ -// swift-tools-version:3.1 -import PackageDescription - -let package = Package( - name: "Stencil", - dependencies: [ - .Package(url: "https://github.com/kylef/PathKit.git", majorVersion: 0, minor: 8), - .Package(url: "https://github.com/kylef/Spectre.git", majorVersion: 0, minor: 7), - ] -) From adb443229d866ecc77f99f29d2d94c87e16a668e Mon Sep 17 00:00:00 2001 From: Yonas Kolb Date: Sat, 1 Sep 2018 19:21:49 +1000 Subject: [PATCH 3/9] add xcodeproject to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index f6eb28e..2dcf7f5 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ Packages/ Package.resolved Package.pins +*.xcodeproj From 420c0eacd71479b9c2a3efd7efdc3d22fc72b1a0 Mon Sep 17 00:00:00 2001 From: Yonas Kolb Date: Mon, 10 Sep 2018 20:59:02 +1000 Subject: [PATCH 4/9] update code to Swift 4.1 --- Sources/ForTag.swift | 2 +- Sources/Inheritence.swift | 6 +++--- Sources/KeyPath.swift | 2 +- Sources/Parser.swift | 12 ++++++------ Sources/Tokenizer.swift | 4 ++-- Sources/Variable.swift | 4 ++-- Tests/StencilTests/ForNodeSpec.swift | 6 +++--- 7 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Sources/ForTag.swift b/Sources/ForTag.swift index 284498f..e2969a7 100644 --- a/Sources/ForTag.swift +++ b/Sources/ForTag.swift @@ -23,7 +23,7 @@ class ForNode : NodeType { throw TemplateSyntaxError("'for' statements should use the syntax: `for in [where ]`.") } - let loopVariables = components[1].characters + let loopVariables = components[1] .split(separator: ",") .map(String.init) .map { $0.trim(character: " ") } diff --git a/Sources/Inheritence.swift b/Sources/Inheritence.swift index db2d67f..c276d10 100644 --- a/Sources/Inheritence.swift +++ b/Sources/Inheritence.swift @@ -64,7 +64,7 @@ class ExtendsNode : NodeType { throw TemplateSyntaxError("'extends' cannot appear more than once in the same template") } - let blockNodes = parsedNodes.flatMap { $0 as? BlockNode } + let blockNodes = parsedNodes.compactMap { $0 as? BlockNode } let nodes = blockNodes.reduce([String: BlockNode]()) { (accumulator, node) -> [String: BlockNode] in var dict = accumulator @@ -159,8 +159,8 @@ class BlockNode : NodeType { } // child node is a block node from child template that extends this node (has the same name) - func childContext(_ child: BlockNode, blockContext: BlockContext, context: Context) throws -> [String: Any?] { - var childContext: [String: Any?] = [BlockContext.contextKey: blockContext] + func childContext(_ child: BlockNode, blockContext: BlockContext, context: Context) throws -> [String: Any] { + var childContext: [String: Any] = [BlockContext.contextKey: blockContext] if let blockSuperNode = child.nodes.first(where: { if case .variable(let variable, _)? = $0.token, variable == "block.super" { return true } diff --git a/Sources/KeyPath.swift b/Sources/KeyPath.swift index 445ef29..7728dcf 100644 --- a/Sources/KeyPath.swift +++ b/Sources/KeyPath.swift @@ -24,7 +24,7 @@ final class KeyPath { subscriptLevel = 0 } - for c in variable.characters { + for c in variable { switch c { case "." where subscriptLevel == 0: try foundSeparator() diff --git a/Sources/Parser.swift b/Sources/Parser.swift index b36f160..817b5fd 100644 --- a/Sources/Parser.swift +++ b/Sources/Parser.swift @@ -108,7 +108,7 @@ public class TokenParser { let filtersWithDistance = allFilters .map({ (filterName: $0, distance: $0.levenshteinDistance(name)) }) // do not suggest filters which names are shorter than the distance - .filter({ $0.filterName.characters.count > $0.distance }) + .filter({ $0.filterName.count > $0.distance }) guard let minDistance = filtersWithDistance.min(by: { $0.distance < $1.distance })?.distance else { return [] } @@ -167,10 +167,10 @@ extension String { // initialize v0 (the previous row of distances) // this row is A[0][i]: edit distance for an empty s // the distance is just the number of characters to delete from t - last = [Int](0...target.characters.count) - current = [Int](repeating: 0, count: target.characters.count + 1) + last = [Int](0...target.count) + current = [Int](repeating: 0, count: target.count + 1) - for i in 0.. 0 { - if let precedingChar = components.last?.characters.last, specialCharacters.characters.contains(precedingChar) { + if let precedingChar = components.last?.last, specialCharacters.contains(precedingChar) { components[components.count-1] += word } else if specialCharacters.contains(word) { components[components.count-1] += word @@ -25,7 +25,7 @@ extension String { } } - for character in self.characters { + for character in self { if character == "'" { singleQuoteCount += 1 } else if character == "\"" { doubleQuoteCount += 1 } diff --git a/Sources/Variable.swift b/Sources/Variable.swift index 1da7439..7c24e8a 100644 --- a/Sources/Variable.swift +++ b/Sources/Variable.swift @@ -9,7 +9,7 @@ class FilterExpression : Resolvable { let variable: Variable init(token: String, parser: TokenParser) throws { - let bits = token.characters.split(separator: "|").map({ String($0).trim(character: " ") }) + let bits = token.split(separator: "|").map({ String($0).trim(character: " ") }) if bits.isEmpty { throw TemplateSyntaxError("Variable tags must include at least 1 argument") } @@ -60,7 +60,7 @@ public struct Variable : Equatable, Resolvable { if (variable.hasPrefix("'") && variable.hasSuffix("'")) || (variable.hasPrefix("\"") && variable.hasSuffix("\"")) { // String literal - return String(variable[variable.characters.index(after: variable.startIndex) ..< variable.characters.index(before: variable.endIndex)]) + return String(variable[variable.index(after: variable.startIndex) ..< variable.index(before: variable.endIndex)]) } // Number literal diff --git a/Tests/StencilTests/ForNodeSpec.swift b/Tests/StencilTests/ForNodeSpec.swift index ddb7692..084dc51 100644 --- a/Tests/StencilTests/ForNodeSpec.swift +++ b/Tests/StencilTests/ForNodeSpec.swift @@ -189,7 +189,7 @@ func testForNode() { let template = Template(templateString: templateString) let result = try template.render(context) - let sortedResult = result.characters.split(separator: ",").map(String.init).sorted(by: <) + let sortedResult = result.split(separator: ",").map(String.init).sorted(by: <) try expect(sortedResult) == ["one: I", "two: II"] } @@ -202,7 +202,7 @@ func testForNode() { let node = ForNode(resolvable: Variable("dict"), loopVariables: ["key"], nodes: nodes, emptyNodes: emptyNodes, where: nil) let result = try node.render(context) - let sortedResult = result.characters.split(separator: ",").map(String.init).sorted(by: <) + let sortedResult = result.split(separator: ",").map(String.init).sorted(by: <) try expect(sortedResult) == ["one", "two"] } @@ -218,7 +218,7 @@ func testForNode() { let result = try node.render(context) - let sortedResult = result.characters.split(separator: ",").map(String.init).sorted(by: <) + let sortedResult = result.split(separator: ",").map(String.init).sorted(by: <) try expect(sortedResult) == ["one=I", "two=II"] } From e6b12c09d33a0ff515d5d275a05f0062c7d3f251 Mon Sep 17 00:00:00 2001 From: Yonas Kolb Date: Sat, 1 Sep 2018 19:34:12 +1000 Subject: [PATCH 5/9] update travis builds to Swift 4.1 --- .travis.yml | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/.travis.yml b/.travis.yml index a18efef..91cea5e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,18 +1,10 @@ matrix: include: - os: osx - osx_image: xcode8.3 - env: SWIFT_VERSION=3.1.1 - - os: osx - osx_image: xcode9 - env: SWIFT_VERSION=4.0 - - os: osx - osx_image: xcode9.1 - env: SWIFT_VERSION=4.0 + osx_image: xcode9.3 + env: SWIFT_VERSION=4.1 - os: linux - env: SWIFT_VERSION=3.1.1 - - os: linux - env: SWIFT_VERSION=4.0 + env: SWIFT_VERSION=4.1 language: generic sudo: required dist: trusty From 8bda4d5bbbe8e071deb59faa736d980644f50969 Mon Sep 17 00:00:00 2001 From: Yonas Kolb Date: Sun, 2 Sep 2018 13:10:41 +1000 Subject: [PATCH 6/9] add changelog entry --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d00731..dc7377c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,9 @@ ### Breaking Changes - _None_ +- Now requires Swift 4.1 or newer. + [Yonas Kolb](https://github.com/yonaskolb) + [#228](https://github.com/stencilproject/Stencil/pull/228) ### New Features From 8e9692c6964864e8f9d845f0afff73141b5346be Mon Sep 17 00:00:00 2001 From: Yonas Kolb Date: Sun, 2 Sep 2018 13:12:20 +1000 Subject: [PATCH 7/9] add swift version to podspec --- Stencil.podspec.json | 1 + 1 file changed, 1 insertion(+) diff --git a/Stencil.podspec.json b/Stencil.podspec.json index fceb79c..d877c7a 100644 --- a/Stencil.podspec.json +++ b/Stencil.podspec.json @@ -23,6 +23,7 @@ "osx": "10.9", "tvos": "9.0" }, + "swift_version": "4.1", "requires_arc": true, "dependencies": { "PathKit": [ From 247a35fd2c5a208e1a768e25f8982fd1f6bf3baf Mon Sep 17 00:00:00 2001 From: David Jennes Date: Sun, 9 Sep 2018 20:42:25 +0200 Subject: [PATCH 8/9] Add CocoaPods version --- Stencil.podspec.json | 1 + 1 file changed, 1 insertion(+) diff --git a/Stencil.podspec.json b/Stencil.podspec.json index d877c7a..a0dde4c 100644 --- a/Stencil.podspec.json +++ b/Stencil.podspec.json @@ -23,6 +23,7 @@ "osx": "10.9", "tvos": "9.0" }, + "cocoapods_version": "1.4.0", "swift_version": "4.1", "requires_arc": true, "dependencies": { From 93ccc56540c07f8a18322c8d643a89a08b394ded Mon Sep 17 00:00:00 2001 From: Yonas Kolb Date: Mon, 10 Sep 2018 20:57:34 +1000 Subject: [PATCH 9/9] update lexer to swift 4 --- Sources/Errors.swift | 2 +- Sources/Lexer.swift | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Sources/Errors.swift b/Sources/Errors.swift index 55b976a..07ee702 100644 --- a/Sources/Errors.swift +++ b/Sources/Errors.swift @@ -67,7 +67,7 @@ open class SimpleErrorReporter: ErrorReporter { func describe(token: Token) -> String { let templateName = token.sourceMap.filename ?? "" let location = token.sourceMap.location - let highlight = "\(String(Array(repeating: " ", count: location.lineOffset)))^\(String(Array(repeating: "~", count: max(token.contents.characters.count - 1, 0))))" + let highlight = "\(String(Array(repeating: " ", count: location.lineOffset)))^\(String(Array(repeating: "~", count: max(token.contents.count - 1, 0))))" return "\(templateName)\(location.lineNumber):\(location.lineOffset): error: \(templateError.reason)\n" + "\(location.content)\n" diff --git a/Sources/Lexer.swift b/Sources/Lexer.swift index fdbc880..26d6a1a 100644 --- a/Sources/Lexer.swift +++ b/Sources/Lexer.swift @@ -11,7 +11,7 @@ struct Lexer { self.templateName = templateName self.templateString = templateString - self.lines = templateString.components(separatedBy: .newlines).enumerated().flatMap { + self.lines = templateString.components(separatedBy: .newlines).enumerated().compactMap { guard !$0.element.isEmpty else { return nil } return (content: $0.element, number: UInt($0.offset + 1), templateString.range(of: $0.element)!) } @@ -19,7 +19,7 @@ struct Lexer { func createToken(string: String, at range: Range) -> Token { func strip() -> String { - guard string.characters.count > 4 else { return "" } + guard string.count > 4 else { return "" } let start = string.index(string.startIndex, offsetBy: 2) let end = string.index(string.endIndex, offsetBy: -2) let trimmed = String(string[start..