Skip to content

Commit 8f1694a

Browse files
authored
Merge pull request #1241 from HubSpot/fix-eager-from-reconstruction
Fix EagerFromTag reconstruction when template file cannot be resolved
2 parents af0819a + 0fe9e88 commit 8f1694a

File tree

2 files changed

+46
-6
lines changed

2 files changed

+46
-6
lines changed

src/main/java/com/hubspot/jinjava/lib/tag/eager/EagerFromTag.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,18 @@
99
import com.hubspot.jinjava.lib.fn.eager.EagerMacroFunction;
1010
import com.hubspot.jinjava.lib.tag.DoTag;
1111
import com.hubspot.jinjava.lib.tag.FromTag;
12-
import com.hubspot.jinjava.loader.RelativePathResolver;
12+
import com.hubspot.jinjava.lib.tag.eager.importing.EagerImportingStrategyFactory;
1313
import com.hubspot.jinjava.tree.Node;
1414
import com.hubspot.jinjava.tree.parse.TagToken;
1515
import com.hubspot.jinjava.util.EagerReconstructionUtils;
16+
import com.hubspot.jinjava.util.PrefixToPreserveState;
1617
import java.io.IOException;
1718
import java.util.List;
1819
import java.util.Map;
1920
import java.util.Map.Entry;
2021
import java.util.Optional;
2122
import java.util.stream.Collectors;
23+
import java.util.stream.Stream;
2224

2325
@Beta
2426
public class EagerFromTag extends EagerStateChangingTag<FromTag> {
@@ -33,6 +35,9 @@ public EagerFromTag(FromTag fromTag) {
3335

3436
@Override
3537
public String getEagerTagImage(TagToken tagToken, JinjavaInterpreter interpreter) {
38+
String initialPathSetter = EagerImportingStrategyFactory.getSetTagForCurrentPath(
39+
interpreter
40+
);
3641
List<String> helper = FromTag.getHelpers(tagToken);
3742
Map<String, String> imports = FromTag.getImportMap(helper);
3843
Optional<String> maybeTemplateFile;
@@ -55,10 +60,17 @@ public String getEagerTagImage(TagToken tagToken, JinjavaInterpreter interpreter
5560
interpreter.getContext().addGlobalMacro(deferredMacro);
5661
});
5762
return (
58-
EagerReconstructionUtils.buildBlockOrInlineSetTag(
59-
RelativePathResolver.CURRENT_PATH_CONTEXT_KEY,
60-
interpreter.getContext().get(RelativePathResolver.CURRENT_PATH_CONTEXT_KEY),
61-
interpreter
63+
initialPathSetter +
64+
new PrefixToPreserveState(
65+
EagerReconstructionUtils.handleDeferredTokenAndReconstructReferences(
66+
interpreter,
67+
DeferredToken
68+
.builderFromToken(tagToken)
69+
.addUsedDeferredWords(Stream.of(helper.get(0)))
70+
.addUsedDeferredWords(imports.keySet())
71+
.addSetDeferredWords(imports.values())
72+
.build()
73+
)
6274
) +
6375
tagToken.getImage()
6476
);

src/test/java/com/hubspot/jinjava/lib/tag/eager/EagerFromTagTest.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,37 @@ public void teardown() {
7575
public void itDefersWhenPathIsDeferred() {
7676
String input = "{% from deferred import foo %}";
7777
String output = interpreter.render(input);
78-
assertThat(output).isEqualTo("{% set current_path = null %}" + input);
78+
assertThat(output).isEqualTo("{% set current_path = '' %}" + input);
7979
assertThat(interpreter.getContext().getGlobalMacro("foo")).isNotNull();
8080
assertThat(interpreter.getContext().getGlobalMacro("foo").isDeferred()).isTrue();
81+
assertThat(interpreter.getContext().getDeferredTokens())
82+
.isNotEmpty()
83+
.anySatisfy(deferredToken -> {
84+
assertThat(deferredToken.getToken().getImage())
85+
.isEqualTo("{% from deferred import foo %}");
86+
assertThat(deferredToken.getSetDeferredWords()).containsExactly("foo");
87+
assertThat(deferredToken.getUsedDeferredWords())
88+
.containsExactlyInAnyOrder("deferred", "foo");
89+
});
90+
}
91+
92+
@Test
93+
public void itDefersWhenPathIsDeferredWithAlias() {
94+
String input = "{% from deferred import foo as new_foo %}";
95+
String output = interpreter.render(input);
96+
assertThat(output).isEqualTo("{% set current_path = '' %}" + input);
97+
assertThat(interpreter.getContext().getGlobalMacro("new_foo")).isNotNull();
98+
assertThat(interpreter.getContext().getGlobalMacro("new_foo").isDeferred()).isTrue();
99+
assertThat(interpreter.getContext().getDeferredTokens())
100+
.isNotEmpty()
101+
.anySatisfy(deferredToken -> {
102+
assertThat(deferredToken.getToken().getImage())
103+
.isEqualTo("{% from deferred import foo as new_foo %}");
104+
assertThat(deferredToken.getSetDeferredWords()).containsExactly("new_foo");
105+
assertThat(deferredToken.getUsedDeferredWords())
106+
.containsExactlyInAnyOrder("deferred", "foo");
107+
});
108+
assertThat(interpreter.getContext().get("new_foo")).isInstanceOf(DeferredValue.class);
81109
}
82110

83111
@Test

0 commit comments

Comments
 (0)