From babbf202d712901eed09efc572f4c82e94eb6062 Mon Sep 17 00:00:00 2001 From: Tyler Kindy Date: Tue, 19 Jul 2022 13:42:03 -0400 Subject: [PATCH 01/11] Add failing tests --- .../interpret/JinjavaInterpreterTest.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java b/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java index cdfe626c6..943e9a592 100644 --- a/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java +++ b/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java @@ -364,4 +364,20 @@ public void itInterpretsFilterChainsInOrder() { assertThat(interpreter.render("{{ 'foo' | upper | replace('O', 'A') }}")) .isEqualTo("FAA"); } + + @Test + public void filterChainsHavePrecedence() { + assertThat(new Jinjava().render("{{ -10 | abs + 4 }}", new HashMap<>())) + .isEqualTo("14"); + assertThat(new Jinjava().render("{{ 4 + -10 | abs }}", new HashMap<>())) + .isEqualTo("14"); + } + + @Test + public void redundantParenthesesDoNotAffectFilterChainPrecedence() { + assertThat(new Jinjava().render("{{ (-10 | abs) + 4 }}", new HashMap<>())) + .isEqualTo("14"); + assertThat(new Jinjava().render("{{ 4 + (-10 | abs) }}", new HashMap<>())) + .isEqualTo("14"); + } } From 96f649e35c4b2e043dfa41d95c9d30b9bc178694 Mon Sep 17 00:00:00 2001 From: Tyler Kindy Date: Tue, 19 Jul 2022 14:09:11 -0400 Subject: [PATCH 02/11] Add simpler failing test --- .../jinjava/interpret/JinjavaInterpreterTest.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java b/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java index 943e9a592..5b09755e8 100644 --- a/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java +++ b/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java @@ -366,18 +366,16 @@ public void itInterpretsFilterChainsInOrder() { } @Test - public void filterChainsHavePrecedence() { - assertThat(new Jinjava().render("{{ -10 | abs + 4 }}", new HashMap<>())) - .isEqualTo("14"); - assertThat(new Jinjava().render("{{ 4 + -10 | abs }}", new HashMap<>())) - .isEqualTo("14"); + public void unaryMinusBindsTighterThanPlus() { + assertThat(new Jinjava().render("{{ -10 + 4 }}", new HashMap<>())).isEqualTo("-6"); + assertThat(new Jinjava().render("{{ 4 + -10 }}", new HashMap<>())).isEqualTo("-6"); } @Test - public void redundantParenthesesDoNotAffectFilterChainPrecedence() { - assertThat(new Jinjava().render("{{ (-10 | abs) + 4 }}", new HashMap<>())) + public void filterChainsBindTighterThanPlus() { + assertThat(new Jinjava().render("{{ -10 | abs + 4 }}", new HashMap<>())) .isEqualTo("14"); - assertThat(new Jinjava().render("{{ 4 + (-10 | abs) }}", new HashMap<>())) + assertThat(new Jinjava().render("{{ 4 + -10 | abs }}", new HashMap<>())) .isEqualTo("14"); } } From ccb43f2dd97afa8210ea205a2c63844d5205e66f Mon Sep 17 00:00:00 2001 From: Tyler Kindy Date: Tue, 19 Jul 2022 14:58:40 -0400 Subject: [PATCH 03/11] Add minimal test --- .../hubspot/jinjava/interpret/JinjavaInterpreterTest.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java b/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java index 5b09755e8..b2e6d08de 100644 --- a/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java +++ b/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java @@ -378,4 +378,9 @@ public void filterChainsBindTighterThanPlus() { assertThat(new Jinjava().render("{{ 4 + -10 | abs }}", new HashMap<>())) .isEqualTo("14"); } + + @Test + public void negativesParse() { + assertThat(new Jinjava().render("{{ -10 }}", new HashMap<>())).isEqualTo("-10"); + } } From ad6882d9c302eadf9b116c267d10421d2a3f4ec4 Mon Sep 17 00:00:00 2001 From: Tyler Kindy Date: Tue, 19 Jul 2022 15:27:53 -0400 Subject: [PATCH 04/11] Use set-up Jinjava --- .../hubspot/jinjava/interpret/JinjavaInterpreterTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java b/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java index b2e6d08de..d3b2d9ac6 100644 --- a/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java +++ b/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java @@ -367,20 +367,20 @@ public void itInterpretsFilterChainsInOrder() { @Test public void unaryMinusBindsTighterThanPlus() { - assertThat(new Jinjava().render("{{ -10 + 4 }}", new HashMap<>())).isEqualTo("-6"); + assertThat(jinjava.render("{{ -10 + 4 }}", new HashMap<>())).isEqualTo("-6"); assertThat(new Jinjava().render("{{ 4 + -10 }}", new HashMap<>())).isEqualTo("-6"); } @Test public void filterChainsBindTighterThanPlus() { - assertThat(new Jinjava().render("{{ -10 | abs + 4 }}", new HashMap<>())) + assertThat(jinjava.render("{{ -10 | abs + 4 }}", new HashMap<>())) .isEqualTo("14"); - assertThat(new Jinjava().render("{{ 4 + -10 | abs }}", new HashMap<>())) + assertThat(jinjava.render("{{ 4 + -10 | abs }}", new HashMap<>())) .isEqualTo("14"); } @Test public void negativesParse() { - assertThat(new Jinjava().render("{{ -10 }}", new HashMap<>())).isEqualTo("-10"); + assertThat(jinjava.render("{{ -10 }}", new HashMap<>())).isEqualTo("-10"); } } From 0f1b932301c4537080c8bf7136810089e75c00c5 Mon Sep 17 00:00:00 2001 From: Tyler Kindy Date: Tue, 19 Jul 2022 15:30:09 -0400 Subject: [PATCH 05/11] Use interpreter directly --- .../jinjava/interpret/JinjavaInterpreterTest.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java b/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java index d3b2d9ac6..80eed9112 100644 --- a/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java +++ b/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java @@ -367,20 +367,18 @@ public void itInterpretsFilterChainsInOrder() { @Test public void unaryMinusBindsTighterThanPlus() { - assertThat(jinjava.render("{{ -10 + 4 }}", new HashMap<>())).isEqualTo("-6"); + assertThat(interpreter.render("{{ -10 + 4 }}")).isEqualTo("-6"); assertThat(new Jinjava().render("{{ 4 + -10 }}", new HashMap<>())).isEqualTo("-6"); } @Test public void filterChainsBindTighterThanPlus() { - assertThat(jinjava.render("{{ -10 | abs + 4 }}", new HashMap<>())) - .isEqualTo("14"); - assertThat(jinjava.render("{{ 4 + -10 | abs }}", new HashMap<>())) - .isEqualTo("14"); + assertThat(interpreter.render("{{ -10 | abs + 4 }}")).isEqualTo("14"); + assertThat(interpreter.render("{{ 4 + -10 | abs }}")).isEqualTo("14"); } @Test public void negativesParse() { - assertThat(jinjava.render("{{ -10 }}", new HashMap<>())).isEqualTo("-10"); + assertThat(interpreter.render("{{ -10 }}")).isEqualTo("-10"); } } From 4f5f162f5e55ceae4f84de43b0eec8e03b0a12ea Mon Sep 17 00:00:00 2001 From: Tyler Kindy Date: Tue, 19 Jul 2022 15:30:34 -0400 Subject: [PATCH 06/11] Rename test for clarity --- .../com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java b/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java index 80eed9112..1b225e453 100644 --- a/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java +++ b/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java @@ -378,7 +378,7 @@ public void filterChainsBindTighterThanPlus() { } @Test - public void negativesParse() { + public void standaloneNegativesParse() { assertThat(interpreter.render("{{ -10 }}")).isEqualTo("-10"); } } From 89549f7a6902ce6961e5f5d38b66103b6a31812a Mon Sep 17 00:00:00 2001 From: Tyler Kindy Date: Tue, 19 Jul 2022 15:46:22 -0400 Subject: [PATCH 07/11] Respect whitespace when parsing whitespace control characters --- .../jinjava/tree/parse/ExpressionToken.java | 11 +---------- .../hubspot/jinjava/tree/parse/TagToken.java | 11 +---------- .../com/hubspot/jinjava/tree/parse/Token.java | 19 +++++++++++++++++++ 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/hubspot/jinjava/tree/parse/ExpressionToken.java b/src/main/java/com/hubspot/jinjava/tree/parse/ExpressionToken.java index fd7efb3b0..3379e8049 100644 --- a/src/main/java/com/hubspot/jinjava/tree/parse/ExpressionToken.java +++ b/src/main/java/com/hubspot/jinjava/tree/parse/ExpressionToken.java @@ -44,16 +44,7 @@ public int getType() { @Override protected void parse() { this.expr = WhitespaceUtils.unwrap(image, "{{", "}}"); - - if (WhitespaceUtils.startsWith(expr, "-")) { - setLeftTrim(true); - this.expr = WhitespaceUtils.unwrap(expr, "-", ""); - } - if (WhitespaceUtils.endsWith(expr, "-")) { - setRightTrim(true); - this.expr = WhitespaceUtils.unwrap(expr, "", "-"); - } - + this.expr = handleTrim(expr); this.expr = StringUtils.trimToEmpty(this.expr); } diff --git a/src/main/java/com/hubspot/jinjava/tree/parse/TagToken.java b/src/main/java/com/hubspot/jinjava/tree/parse/TagToken.java index c9cf7af9c..d73c33b22 100644 --- a/src/main/java/com/hubspot/jinjava/tree/parse/TagToken.java +++ b/src/main/java/com/hubspot/jinjava/tree/parse/TagToken.java @@ -16,7 +16,6 @@ package com.hubspot.jinjava.tree.parse; import com.hubspot.jinjava.interpret.TemplateSyntaxException; -import com.hubspot.jinjava.util.WhitespaceUtils; public class TagToken extends Token { private static final long serialVersionUID = -4927751270481832992L; @@ -54,15 +53,7 @@ protected void parse() { } content = image.substring(2, image.length() - 2); - - if (WhitespaceUtils.startsWith(content, "-")) { - setLeftTrim(true); - content = WhitespaceUtils.unwrap(content, "-", ""); - } - if (WhitespaceUtils.endsWith(content, "-")) { - setRightTrim(true); - content = WhitespaceUtils.unwrap(content, "", "-"); - } + content = handleTrim(content); int nameStart = -1, pos = 0, len = content.length(); diff --git a/src/main/java/com/hubspot/jinjava/tree/parse/Token.java b/src/main/java/com/hubspot/jinjava/tree/parse/Token.java index 53d838568..c9bad320e 100644 --- a/src/main/java/com/hubspot/jinjava/tree/parse/Token.java +++ b/src/main/java/com/hubspot/jinjava/tree/parse/Token.java @@ -83,6 +83,25 @@ public void setRightTrimAfterEnd(boolean rightTrimAfterEnd) { this.rightTrimAfterEnd = rightTrimAfterEnd; } + /** + * Handle any whitespace control characters, capturing whether leading or trailing + * whitespace should be stripped. + * @param unwrapped the content of the block stripped of its delimeters + * @return the content stripped of any whitespace control characters. + */ + protected final String handleTrim(String unwrapped) { + String result = unwrapped; + if (unwrapped.startsWith("-")) { + setLeftTrim(true); + result = unwrapped.substring(1); + } + if (unwrapped.endsWith("-")) { + setRightTrim(true); + result = unwrapped.substring(0, unwrapped.length() - 1); + } + return result; + } + public int getStartPosition() { return startPosition; } From 5206428c04cb9867fa6f75ad0df0ee13bae62d37 Mon Sep 17 00:00:00 2001 From: Tyler Kindy Date: Wed, 20 Jul 2022 13:38:15 -0400 Subject: [PATCH 08/11] Fix example --- src/test/resources/eager/handles-deferred-in-ifchanged.jinja | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/resources/eager/handles-deferred-in-ifchanged.jinja b/src/test/resources/eager/handles-deferred-in-ifchanged.jinja index c8179a3af..db2f035d7 100644 --- a/src/test/resources/eager/handles-deferred-in-ifchanged.jinja +++ b/src/test/resources/eager/handles-deferred-in-ifchanged.jinja @@ -1,6 +1,6 @@ {% set foo = [1, 1, 2, 1] %} {%- for item in foo -%} -{%- ifchanged item- %} +{%- ifchanged item -%} {{ deferred[item] }} {%- endifchanged -%} {% endfor%} From 0c9d70bf0a90d705ffff8f95d2096acf75d45193 Mon Sep 17 00:00:00 2001 From: Tyler Kindy Date: Thu, 21 Jul 2022 16:26:09 -0400 Subject: [PATCH 09/11] Reorganize and rename tests --- .../interpret/JinjavaInterpreterTest.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java b/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java index 1b225e453..1cf32d973 100644 --- a/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java +++ b/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java @@ -355,30 +355,30 @@ public void itBindsUnaryMinusTighterThanFilters() { } @Test - public void itBindsFiltersTighterThanMul() { - assertThat(interpreter.render("{{ (-5 * -4 | abs) }}")).isEqualTo("-20"); + public void itBindsUnaryMinusTighterThanPlus() { + assertThat(interpreter.render("{{ -10 + 4 }}")).isEqualTo("-6"); + assertThat(new Jinjava().render("{{ 4 + -10 }}", new HashMap<>())).isEqualTo("-6"); } @Test - public void itInterpretsFilterChainsInOrder() { - assertThat(interpreter.render("{{ 'foo' | upper | replace('O', 'A') }}")) - .isEqualTo("FAA"); + public void itBindsFiltersTighterThanMul() { + assertThat(interpreter.render("{{ (-5 * -4 | abs) }}")).isEqualTo("-20"); } @Test - public void unaryMinusBindsTighterThanPlus() { - assertThat(interpreter.render("{{ -10 + 4 }}")).isEqualTo("-6"); - assertThat(new Jinjava().render("{{ 4 + -10 }}", new HashMap<>())).isEqualTo("-6"); + public void itBindsFiltersTighterThanPlus() { + assertThat(interpreter.render("{{ -10 | abs + 4 }}")).isEqualTo("14"); + assertThat(interpreter.render("{{ 4 + -10 | abs }}")).isEqualTo("14"); } @Test - public void filterChainsBindTighterThanPlus() { - assertThat(interpreter.render("{{ -10 | abs + 4 }}")).isEqualTo("14"); - assertThat(interpreter.render("{{ 4 + -10 | abs }}")).isEqualTo("14"); + public void itInterpretsFilterChainsInOrder() { + assertThat(interpreter.render("{{ 'foo' | upper | replace('O', 'A') }}")) + .isEqualTo("FAA"); } @Test - public void standaloneNegativesParse() { + public void itInterpretsStandaloneNegatives() { assertThat(interpreter.render("{{ -10 }}")).isEqualTo("-10"); } } From c0b15582b9e6ba649470c6f2c3039de4db43c361 Mon Sep 17 00:00:00 2001 From: Tyler Kindy Date: Thu, 21 Jul 2022 16:29:30 -0400 Subject: [PATCH 10/11] Fix missed Jinjava construction --- .../com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java b/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java index 1cf32d973..8d13c26d0 100644 --- a/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java +++ b/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java @@ -357,7 +357,7 @@ public void itBindsUnaryMinusTighterThanFilters() { @Test public void itBindsUnaryMinusTighterThanPlus() { assertThat(interpreter.render("{{ -10 + 4 }}")).isEqualTo("-6"); - assertThat(new Jinjava().render("{{ 4 + -10 }}", new HashMap<>())).isEqualTo("-6"); + assertThat(interpreter.render("{{ 4 + -10 }}")).isEqualTo("-6"); } @Test From e142fbf16e2124d17646be8efc43c24da2bfbbd8 Mon Sep 17 00:00:00 2001 From: Tyler Kindy Date: Thu, 21 Jul 2022 16:31:32 -0400 Subject: [PATCH 11/11] Remove unnecessary parens --- .../hubspot/jinjava/interpret/JinjavaInterpreterTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java b/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java index 8d13c26d0..561efd431 100644 --- a/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java +++ b/src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java @@ -335,7 +335,7 @@ public void itHidesWarningErrors() { @Test public void itBindsUnaryMinusTighterThanCmp() { - assertThat(interpreter.render("{{ (-5 > 4) }}")).isEqualTo("false"); + assertThat(interpreter.render("{{ -5 > 4 }}")).isEqualTo("false"); } @Test @@ -351,7 +351,7 @@ public void itBindsUnaryMinusTighterThanIsNot() { @Test public void itBindsUnaryMinusTighterThanFilters() { - assertThat(interpreter.render("{{ (-5 | abs) }}")).isEqualTo("5"); + assertThat(interpreter.render("{{ -5 | abs }}")).isEqualTo("5"); } @Test @@ -362,7 +362,7 @@ public void itBindsUnaryMinusTighterThanPlus() { @Test public void itBindsFiltersTighterThanMul() { - assertThat(interpreter.render("{{ (-5 * -4 | abs) }}")).isEqualTo("-20"); + assertThat(interpreter.render("{{ -5 * -4 | abs }}")).isEqualTo("-20"); } @Test