Skip to content

Commit 7fa7179

Browse files
authored
Merge pull request #751 from HubSpot/deferred-import-choice
[Eager Execution] Fix deferred import selection
2 parents 0c7a9c2 + 1e6bed9 commit 7fa7179

File tree

6 files changed

+55
-9
lines changed

6 files changed

+55
-9
lines changed

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

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,11 @@ public String getEagerTagImage(TagToken tagToken, JinjavaInterpreter interpreter
101101
// Since some values got deferred, output a DoTag that will load the currentImportAlias on the context.
102102
return (
103103
newPathSetter +
104+
EagerReconstructionUtils.buildSetTag(
105+
ImmutableMap.of(currentImportAlias, "{}"),
106+
interpreter,
107+
true
108+
) +
104109
output +
105110
getDoTagToPreserve(interpreter, currentImportAlias) +
106111
initialPathSetter
@@ -152,14 +157,6 @@ private static String getDoTagToPreserve(
152157
.getContext()
153158
.getSessionBindings()
154159
.get(currentImportAlias);
155-
if ((!(currentAliasMap instanceof DeferredValue))) {
156-
// Make sure that the map is deferred.
157-
if (!(currentAliasMap instanceof Map)) {
158-
currentAliasMap = new PyMap(new HashMap<>());
159-
}
160-
currentAliasMap = DeferredValue.instance(currentAliasMap);
161-
interpreter.getContext().put(currentImportAlias, currentAliasMap);
162-
}
163160
for (Map.Entry<String, Object> entry : (
164161
(Map<String, Object>) ((DeferredValue) currentAliasMap).getOriginalValue()
165162
).entrySet()) {

src/test/java/com/hubspot/jinjava/EagerTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -929,4 +929,11 @@ public void itDefersChangesWithinDeferredSetBlockSecondPass() {
929929
"defers-changes-within-deferred-set-block.expected"
930930
);
931931
}
932+
933+
@Test
934+
public void itHandlesImportInDeferredIf() {
935+
expectedTemplateInterpreter.assertExpectedOutputNonIdempotent(
936+
"handles-import-in-deferred-if"
937+
);
938+
}
932939
}

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,29 @@ public void itDefersQuadLayer() {
447447
assertThat(interpreter.render(result).trim()).isEqualTo("12345 cbaabaaba");
448448
}
449449

450+
@Test
451+
public void itHandlesQuadLayerInDeferredIf() {
452+
setupResourceLocator();
453+
context.put("a_val", "a");
454+
context.put("b_val", "b");
455+
String result = interpreter.render(
456+
"{% if deferred %}{% import 'import-tree-b.jinja' as b %}{% endif %}"
457+
);
458+
assertThat(result)
459+
.isEqualTo(
460+
"{% if deferred %}{% set current_path = 'import-tree-b.jinja' %}{% set b = {} %}{% set current_path = 'import-tree-a.jinja' %}{% set a = {} %}{% set something = 'somn' %}{% do a.update({\"something\": something}) %}\n" +
461+
"{% set foo_a = 'a' %}{% do a.update({\"foo_a\": foo_a}) %}\n" +
462+
"{% do a.update({'foo_a': 'a','import_resource_path': 'import-tree-a.jinja','something': 'somn'}) %}{% set current_path = 'import-tree-b.jinja' %}\n" +
463+
"{% set foo_b = 'b' + a.foo_a %}{% do b.update({\"foo_b\": foo_b}) %}\n" +
464+
"{% do b.update({'a': a,'foo_b': foo_b,'import_resource_path': 'import-tree-b.jinja'}) %}{% set current_path = '' %}{% endif %}"
465+
);
466+
467+
context.put("deferred", true);
468+
interpreter.render(result);
469+
assertThat(interpreter.render("{{ b.foo_b }}")).isEqualTo("ba");
470+
assertThat(interpreter.render("{{ b.a.foo_a }}")).isEqualTo("a");
471+
}
472+
450473
@Test
451474
public void itCorrectlySetsAliasedPath() {
452475
setupResourceLocator();

src/test/resources/eager/handles-deferred-import-vars.expected.jinja

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Hello {{ myname }}
44

55
foo: Hello {{ myname }}
66
bar: {{ bar }}
7-
---{% set myname = deferred + 7 %}{% set current_path = 'macro-and-set.jinja' %}
7+
---{% set myname = deferred + 7 %}{% set current_path = 'macro-and-set.jinja' %}{% set simple = {} %}
88
{% set bar = myname + 19 %}{% set simple = {} %}{% do simple.update({"bar": bar}) %}
99
Hello {{ myname }}
1010
{% do simple.update({'import_resource_path': 'macro-and-set.jinja'}) %}{% set current_path = '' %}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{% if deferred %}{% set current_path = 'macro-and-set.jinja' %}{% set simple = {} %}
2+
{% set bar = 'person19' %}{% do simple.update({"bar": bar}) %}
3+
Hello person
4+
{% do simple.update({'bar': 'person19','import_resource_path': 'macro-and-set.jinja'}) %}{% set current_path = '' %}
5+
{% else %}{% set current_path = 'macro-and-set.jinja' %}{% set simple = {} %}
6+
{% set bar = 'person19' %}{% do simple.update({"bar": bar}) %}
7+
Hello person
8+
{% do simple.update({'bar': 'person19','import_resource_path': 'macro-and-set.jinja'}) %}{% set current_path = '' %}
9+
{% endif %}
10+
simple.foo: {{ simple.foo() }}
11+
simple.bar: {{ simple.bar }}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{% set myname = 'person' %}
2+
{% if deferred %}
3+
{%- import "macro-and-set.jinja" as simple -%}
4+
{% else %}
5+
{%- import "macro-and-set.jinja" as simple -%}
6+
{% endif %}
7+
simple.foo: {{ simple.foo() }}
8+
simple.bar: {{ simple.bar }}

0 commit comments

Comments
 (0)