From 29e859f1aab20235d5a4564948ad442e12cecfe1 Mon Sep 17 00:00:00 2001 From: Ilya Puchka Date: Thu, 5 Apr 2018 01:13:34 +0100 Subject: [PATCH] fix: Do not print Optional(...) when rendering arrays (#205) --- CHANGELOG.md | 1 + Sources/Node.swift | 15 +++++++++++++++ Tests/StencilTests/VariableSpec.swift | 10 +++++++++- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e77b189..df370d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ - Fixed comparing string variables with string literals, in Swift 4 string literals became `Substring` and thus couldn't be directly compared to strings. - Integer literals now resolve into Int values, not Float - Fixed accessing properties of optional properties via reflection +- No longer render optional values in arrays as `Optional(..)` ## 0.10.1 diff --git a/Sources/Node.swift b/Sources/Node.swift index 5b47177..36208a3 100644 --- a/Sources/Node.swift +++ b/Sources/Node.swift @@ -78,6 +78,8 @@ public class VariableNode : NodeType { func stringify(_ result: Any?) -> String { if let result = result as? String { return result + } else if let array = result as? [Any?] { + return unwrap(array).description } else if let result = result as? CustomStringConvertible { return result.description } else if let result = result as? NSObject { @@ -86,3 +88,16 @@ func stringify(_ result: Any?) -> String { return "" } + +func unwrap(_ array: [Any?]) -> [Any] { + return array.map { (item: Any?) -> Any in + if let item = item { + if let items = item as? [Any?] { + return unwrap(items) + } else { + return item + } + } + else { return item as Any } + } +} diff --git a/Tests/StencilTests/VariableSpec.swift b/Tests/StencilTests/VariableSpec.swift index 6dad505..5d3e884 100644 --- a/Tests/StencilTests/VariableSpec.swift +++ b/Tests/StencilTests/VariableSpec.swift @@ -148,7 +148,7 @@ func testVariable() { try expect(result) == "Foo" } #endif - + $0.it("can resolve a value via reflection") { let variable = Variable("blog.articles.0.author.name") let result = try variable.resolve(context) as? String @@ -167,5 +167,13 @@ func testVariable() { try expect(result) == "Jhon" } + $0.it("does not render Optional") { + var array: [Any?] = [1, nil] + array.append(array) + let context = Context(dictionary: ["values": array]) + + try expect(VariableNode(variable: "values").render(context)) == "[1, nil, [1, nil]]" + try expect(VariableNode(variable: "values.1").render(context)) == "" + } } }