From 8f6b403aa914b5b7d059cbc3a78f93f81554409d Mon Sep 17 00:00:00 2001 From: Kyle Fuller Date: Thu, 8 Dec 2016 15:56:29 +0000 Subject: [PATCH] fix(join): Dont force strings --- Sources/Filters.swift | 16 ++++++++-------- Tests/StencilTests/FilterSpec.swift | 19 ++++++++++++++++++- docs/builtins.rst | 4 ++-- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/Sources/Filters.swift b/Sources/Filters.swift index a172516..9b7cb24 100644 --- a/Sources/Filters.swift +++ b/Sources/Filters.swift @@ -47,17 +47,17 @@ func defaultFilter(value: Any?, arguments: [Any?]) -> Any? { } func joinFilter(value: Any?, arguments: [Any?]) throws -> Any? { - guard arguments.count == 1 else { + guard arguments.count < 2 else { throw TemplateSyntaxError("'join' filter takes a single argument") } - guard let separator = arguments.first as? String else { - throw TemplateSyntaxError("'join' filter takes a separator as string") + let separator = stringify(arguments.first ?? "") + + if let value = value as? [Any] { + return value + .map(stringify) + .joined(separator: separator) } - if let value = value as? [String] { - return value.joined(separator: separator) - } - - return nil + return value } diff --git a/Tests/StencilTests/FilterSpec.swift b/Tests/StencilTests/FilterSpec.swift index cc6e4fc..3f86cb3 100644 --- a/Tests/StencilTests/FilterSpec.swift +++ b/Tests/StencilTests/FilterSpec.swift @@ -125,9 +125,26 @@ func testFilter() { describe("join filter") { let template = Template(templateString: "{{ value|join:\", \" }}") - $0.it("transforms a string to be lowercase") { + $0.it("joins a collection of strings") { let result = try template.render(Context(dictionary: ["value": ["One", "Two"]])) try expect(result) == "One, Two" } + + $0.it("joins a mixed-type collection") { + let result = try template.render(Context(dictionary: ["value": ["One", 2, true, 10.5, "Five"]])) + try expect(result) == "One, 2, true, 10.5, Five" + } + + $0.it("can join by non string") { + let template = Template(templateString: "{{ value|join:separator }}") + let result = try template.render(Context(dictionary: ["value": ["One", "Two"], "separator": true])) + try expect(result) == "OnetrueTwo" + } + + $0.it("can join without arguments") { + let template = Template(templateString: "{{ value|join }}") + let result = try template.render(Context(dictionary: ["value": ["One", "Two"]])) + try expect(result) == "OneTwo" + } } } diff --git a/docs/builtins.rst b/docs/builtins.rst index 2935c86..b4657c8 100644 --- a/docs/builtins.rst +++ b/docs/builtins.rst @@ -279,10 +279,10 @@ value of the variable. For example: ``join`` ~~~~~~~~ -Join an array with a string. +Join an array of items. .. code-block:: html+django {{ value|join:", " }} -.. note:: The value MUST be an array of Strngs and the separator must be a string. +.. note:: The value MUST be an array.