diff --git a/src/main/java/com/hubspot/jinjava/lib/tag/IncludeTag.java b/src/main/java/com/hubspot/jinjava/lib/tag/IncludeTag.java index ff06a1e5f..cdebc0041 100644 --- a/src/main/java/com/hubspot/jinjava/lib/tag/IncludeTag.java +++ b/src/main/java/com/hubspot/jinjava/lib/tag/IncludeTag.java @@ -60,25 +60,7 @@ public class IncludeTag implements Tag { @Override public String interpret(TagNode tagNode, JinjavaInterpreter interpreter) { - HelperStringTokenizer helper = new HelperStringTokenizer(tagNode.getHelpers()); - if (!helper.hasNext()) { - throw new TemplateSyntaxException( - tagNode.getMaster().getImage(), - "Tag 'include' expects template path", - tagNode.getLineNumber(), - tagNode.getStartPosition() - ); - } - - String path = StringUtils.trimToEmpty(helper.next()); - String templateFile = interpreter.resolveString( - path, - tagNode.getLineNumber(), - tagNode.getStartPosition() - ); - templateFile = interpreter.resolveResourceLocation(templateFile); - - final String finalTemplateFile = templateFile; + final String finalTemplateFile = resolveTemplateFile(tagNode, interpreter); final TagNode finalTagNode = tagNode; try ( AutoCloseableImpl> includeStackWrapper = @@ -165,6 +147,30 @@ public String interpret(TagNode tagNode, JinjavaInterpreter interpreter) { } } + public static String resolveTemplateFile( + TagNode tagNode, + JinjavaInterpreter interpreter + ) { + HelperStringTokenizer helper = new HelperStringTokenizer(tagNode.getHelpers()); + if (!helper.hasNext()) { + throw new TemplateSyntaxException( + tagNode.getMaster().getImage(), + "Tag 'include' expects template path", + tagNode.getLineNumber(), + tagNode.getStartPosition() + ); + } + + String path = StringUtils.trimToEmpty(helper.next()); + String templateFile = interpreter.resolveString( + path, + tagNode.getLineNumber(), + tagNode.getStartPosition() + ); + templateFile = interpreter.resolveResourceLocation(templateFile); + return templateFile; + } + @Override public String getEndTagName() { return null; diff --git a/src/main/java/com/hubspot/jinjava/lib/tag/eager/EagerIncludeTag.java b/src/main/java/com/hubspot/jinjava/lib/tag/eager/EagerIncludeTag.java index 601b7deba..91450dadf 100644 --- a/src/main/java/com/hubspot/jinjava/lib/tag/eager/EagerIncludeTag.java +++ b/src/main/java/com/hubspot/jinjava/lib/tag/eager/EagerIncludeTag.java @@ -5,8 +5,6 @@ import com.hubspot.jinjava.lib.tag.IncludeTag; import com.hubspot.jinjava.tree.TagNode; import com.hubspot.jinjava.util.EagerReconstructionUtils; -import com.hubspot.jinjava.util.HelperStringTokenizer; -import org.apache.commons.lang3.StringUtils; @Beta public class EagerIncludeTag extends EagerTagDecorator { @@ -17,17 +15,10 @@ public EagerIncludeTag(IncludeTag tag) { @Override public String innerInterpret(TagNode tagNode, JinjavaInterpreter interpreter) { + String templateFile = IncludeTag.resolveTemplateFile(tagNode, interpreter); int numDeferredTokensStart = interpreter.getContext().getDeferredTokens().size(); String output = super.innerInterpret(tagNode, interpreter); if (interpreter.getContext().getDeferredTokens().size() > numDeferredTokensStart) { - HelperStringTokenizer helper = new HelperStringTokenizer(tagNode.getHelpers()); - String path = StringUtils.trimToEmpty(helper.next()); - String templateFile = interpreter.resolveString( - path, - tagNode.getLineNumber(), - tagNode.getStartPosition() - ); - templateFile = interpreter.resolveResourceLocation(templateFile); return EagerReconstructionUtils.wrapPathAroundText( output, templateFile, diff --git a/src/test/java/com/hubspot/jinjava/EagerTest.java b/src/test/java/com/hubspot/jinjava/EagerTest.java index e720a02bc..0ba42fe2c 100644 --- a/src/test/java/com/hubspot/jinjava/EagerTest.java +++ b/src/test/java/com/hubspot/jinjava/EagerTest.java @@ -1722,4 +1722,22 @@ public void itHandlesContinueInDeferredForLoopSecondPass() { public void itReconstructsFromedMacro() { expectedTemplateInterpreter.assertExpectedOutput("reconstructs-fromed-macro/test"); } + + @Test + public void itHandlesModifiedIncludePath() { + expectedTemplateInterpreter.assertExpectedOutputNonIdempotent( + "handles-modified-include-path/test" + ); + } + + @Test + public void itHandlesModifiedIncludePathSecondPass() { + localContext.put("deferred", "resolved"); + expectedTemplateInterpreter.assertExpectedOutput( + "handles-modified-include-path/test.expected" + ); + expectedTemplateInterpreter.assertExpectedNonEagerOutput( + "handles-modified-include-path/test.expected" + ); + } } diff --git a/src/test/resources/eager/handles-modified-include-path/a.jinja b/src/test/resources/eager/handles-modified-include-path/a.jinja new file mode 100644 index 000000000..f110cc07a --- /dev/null +++ b/src/test/resources/eager/handles-modified-include-path/a.jinja @@ -0,0 +1,3 @@ +This is include a +{% if deferred %}{% set include_path = './b.jinja' %}{% endif %} +{% include include_path %} diff --git a/src/test/resources/eager/handles-modified-include-path/b.jinja b/src/test/resources/eager/handles-modified-include-path/b.jinja new file mode 100644 index 000000000..89dd18796 --- /dev/null +++ b/src/test/resources/eager/handles-modified-include-path/b.jinja @@ -0,0 +1 @@ +This is include b \ No newline at end of file diff --git a/src/test/resources/eager/handles-modified-include-path/test.expected.expected.jinja b/src/test/resources/eager/handles-modified-include-path/test.expected.expected.jinja new file mode 100644 index 000000000..41ccc3a6b --- /dev/null +++ b/src/test/resources/eager/handles-modified-include-path/test.expected.expected.jinja @@ -0,0 +1,6 @@ +Before include +This is include a + +This is include b + +After include \ No newline at end of file diff --git a/src/test/resources/eager/handles-modified-include-path/test.expected.jinja b/src/test/resources/eager/handles-modified-include-path/test.expected.jinja new file mode 100644 index 000000000..a42233536 --- /dev/null +++ b/src/test/resources/eager/handles-modified-include-path/test.expected.jinja @@ -0,0 +1,10 @@ +Before include +{% set __temp_meta_current_path_1035152568__,current_path = current_path,'eager/handles-modified-include-path/a.jinja' %}\ +This is include a +{% set include_path = './a.jinja' %}\ +{% if deferred %}\ +{% set include_path = './b.jinja' %}\ +{% endif %} +{% include include_path %} +{% set current_path,__temp_meta_current_path_1035152568__ = __temp_meta_current_path_1035152568__,null %} +After include \ No newline at end of file diff --git a/src/test/resources/eager/handles-modified-include-path/test.jinja b/src/test/resources/eager/handles-modified-include-path/test.jinja new file mode 100644 index 000000000..21ec080fc --- /dev/null +++ b/src/test/resources/eager/handles-modified-include-path/test.jinja @@ -0,0 +1,4 @@ +{% set include_path = './a.jinja' %} +Before include +{% include include_path %} +After include