Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -427,6 +427,7 @@ private String render(Node root, boolean processExtendRoots, long renderLimit) {
output.addNode(pathSetter);
Optional<String> basePath = context.getCurrentPathStack().peek();
StringBuilder ignoredOutput = new StringBuilder();
boolean preserveBlocks = false;
// render all extend parents, keeping the last as the root output
if (processExtendRoots) {
Set<String> extendPaths = new HashSet<>();
Expand Down Expand Up @@ -495,10 +496,23 @@ private String render(Node root, boolean processExtendRoots, long renderLimit) {
basePath = Optional.of(currentPath);
}
}
preserveBlocks = (context.getDeferredTokens().size() > numDeferredTokensBefore);
}

int numDeferredTokensBefore = context.getDeferredTokens().size();
resolveBlockStubs(output);
if (preserveBlocks) {
for (BlockPlaceholderOutputNode blockPlaceholder : output.getBlocks()) {
blockPlaceholder.resolve(
EagerReconstructionUtils.wrapInTag(
blockPlaceholder.getValue(),
"block %s".formatted(blockPlaceholder.getBlockName()),
this,
false
)
);
}
}
if (context.getDeferredTokens().size() > numDeferredTokensBefore) {
pathSetter.setValue(
EagerReconstructionUtils.buildBlockOrInlineSetTag(
Expand Down
61 changes: 61 additions & 0 deletions src/test/java/com/hubspot/jinjava/EagerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -1753,4 +1753,65 @@ public void itHandlesDeferredValueInRenderFilter() {
"handles-deferred-value-in-render-filter/test"
);
}

@Test
public void itHandlesDeferredUsedInMultipleBlockLevels() {
expectedTemplateInterpreter.assertExpectedOutputNonIdempotent(
"handles-deferred-used-in-multiple-block-levels/test"
);
}

@Test
public void itHandlesDeferredUsedInMultipleBlockLevelsSecondPass() {
localContext.put("deferred", "resolved");
expectedTemplateInterpreter.assertExpectedOutput(
"handles-deferred-used-in-multiple-block-levels/test.expected"
);
expectedTemplateInterpreter.assertExpectedNonEagerOutput(
"handles-deferred-used-in-multiple-block-levels/test.expected"
);
}

@Test
public void itDoesNotDeferBlockWhenOnlyMiddleDefers() {
expectedTemplateInterpreter.assertExpectedOutputNonIdempotent(
"does-not-defer-block-when-only-middle-defers/test"
);
}

@Test
public void itDoesNotDeferBlockWhenOnlyMiddleDefersSecondPass() {
localContext.put("deferred", "resolved");
expectedTemplateInterpreter.assertExpectedOutput(
"does-not-defer-block-when-only-middle-defers/test.expected"
);
expectedTemplateInterpreter.assertExpectedNonEagerOutput(
"does-not-defer-block-when-only-middle-defers/test.expected"
);
}

@Test
public void itPreservesBlocksForReconstructionOrder() {
expectedTemplateInterpreter.assertExpectedOutputNonIdempotent(
"preserves-blocks-for-reconstruction-order/test"
);
}

@Test
public void itPreservesBlocksForReconstructionOrderSecondPhase() {
localContext.put("deferred", "resolved");
String twoPhaseOutput = expectedTemplateInterpreter.assertExpectedOutput(
"preserves-blocks-for-reconstruction-order/test.expected"
);
expectedTemplateInterpreter.assertExpectedNonEagerOutput(
"preserves-blocks-for-reconstruction-order/test.expected"
);
// Sanity check
assertThat(twoPhaseOutput)
.isEqualToIgnoringWhitespace(
expectedTemplateInterpreter.renderTemplate(
"preserves-blocks-for-reconstruction-order/test"
)
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,7 @@ private ExpectedTemplateInterpreter(
}

public String assertExpectedOutput(String name) {
String template = getFixtureTemplate(name);
String output = JinjavaInterpreter.getCurrent().render(template);
String output = renderTemplate(name);
assertThat(JinjavaInterpreter.getCurrent().getContext().getDeferredNodes())
.as("Ensure no deferred nodes were created")
.isEmpty();
Expand All @@ -60,9 +59,13 @@ public String assertExpectedOutput(String name) {
return output;
}

public String assertExpectedOutputNonIdempotent(String name) {
public String renderTemplate(String name) {
String template = getFixtureTemplate(name);
String output = JinjavaInterpreter.getCurrent().render(template);
return JinjavaInterpreter.getCurrent().render(template);
}

public String assertExpectedOutputNonIdempotent(String name) {
String output = renderTemplate(name);
assertThat(JinjavaInterpreter.getCurrent().getContext().getDeferredNodes())
.as("Ensure no deferred nodes were created")
.isEmpty();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{% set tracker_base = '1_base' %}


-----Pre-First-----
{% block first -%}
{%- endblock %}
-----Post-First-----
-----Pre-Second-----
{% block second -%}
{%- endblock %}
-----Post-Second-----
We aren't deferring tracker base.{# This message WILL show up in final output #}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{% extends '../../eager/does-not-defer-block-when-only-middle-defers/base.jinja' %}
{% set tracker_middle = '2_middle' %}
{% block first %}
I WON'T SHOW UP
{% endblock %}

{% block second %}
tracker_base is '1_base': {{ tracker_base }}? {{ tracker_base == '1_base' }}
tracker_middle is 'resolved': {{ tracker_middle }}? {{ tracker_middle == 'resolved' }}
tracker_test is 'resolved': {{ tracker_test }}? {{ tracker_test == 'resolved' }}
{% endblock %}
Deferring tracker middle.{# This message will not show up in final output #}
{% set tracker_middle = deferred %}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
-----Pre-First-----

tracker_base is '1_base': 1_base? true
tracker_middle is 'resolved': resolved? true
tracker_test is 'resolved': resolved? true

-----Post-First-----
-----Pre-Second-----

tracker_base is '1_base': 1_base? true
tracker_middle is 'resolved': resolved? true
tracker_test is 'resolved': resolved? true

-----Post-Second-----
We aren't deferring tracker base.
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
{# Start Label: ignored_output_from_extends #}{% do %}



Deferring tracker test.
{% set tracker_test = deferred %}





Deferring tracker middle.
{% set tracker_middle = deferred %}
{% enddo %}\
{# End Label: ignored_output_from_extends #}{% set current_path = 'eager/does-not-defer-block-when-only-middle-defers/base.jinja' %}


-----Pre-First-----
{% set __temp_meta_current_path_1008935144__,current_path = current_path,'eager/does-not-defer-block-when-only-middle-defers/test.jinja' %}
tracker_base is '1_base': 1_base? true
tracker_middle is 'resolved': {{ tracker_middle }}\
? {{ tracker_middle == 'resolved' }}
tracker_test is 'resolved': {{ tracker_test }}\
? {{ tracker_test == 'resolved' }}
{% set current_path,__temp_meta_current_path_1008935144__ = __temp_meta_current_path_1008935144__,null %}
-----Post-First-----
-----Pre-Second-----
{% set __temp_meta_current_path_245328778__,current_path = current_path,'eager/does-not-defer-block-when-only-middle-defers/middle.jinja' %}
tracker_base is '1_base': 1_base? true
tracker_middle is 'resolved': {{ tracker_middle }}\
? {{ tracker_middle == 'resolved' }}
tracker_test is 'resolved': {{ tracker_test }}\
? {{ tracker_test == 'resolved' }}
{% set current_path,__temp_meta_current_path_245328778__ = __temp_meta_current_path_245328778__,null %}
-----Post-Second-----
We aren't deferring tracker base.
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{% extends '../../eager/does-not-defer-block-when-only-middle-defers/middle.jinja' %}

{% set tracker_test = '3_test' %}
{% block first %}
tracker_base is '1_base': {{ tracker_base }}? {{ tracker_base == '1_base' }}
tracker_middle is 'resolved': {{ tracker_middle }}? {{ tracker_middle == 'resolved' }}
tracker_test is 'resolved': {{ tracker_test }}? {{ tracker_test == 'resolved' }}
{% endblock %}
Deferring tracker test.{# This message will not show up in final output #}
{% set tracker_test = deferred %}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{% set tracker_base = '1_base' %}

tracker_base is '1_base': {{ tracker_base }}? {{ tracker_base == '1_base' }}
tracker_middle is 'resolved': {{ tracker_middle }}? {{ tracker_middle == 'resolved' }}
tracker_test is 'resolved': {{ tracker_test }}? {{ tracker_test == 'resolved' }}
-----Pre-First-----
{% block first -%}
tracker_base is 'resolved': {{ tracker_base }}? {{ tracker_base == 'resolved' }}
tracker_middle is 'resolved': {{ tracker_middle }}? {{ tracker_middle == 'resolved' }}
tracker_test is 'resolved': {{ tracker_test }}? {{ tracker_test == 'resolved' }}
{%- endblock %}
-----Post-First-----
tracker_base is '1_base': {{ tracker_base }}? {{ tracker_base == '1_base' }}
tracker_middle is 'resolved': {{ tracker_middle }}? {{ tracker_middle == 'resolved' }}
tracker_test is 'resolved': {{ tracker_test }}? {{ tracker_test == 'resolved' }}
-----Pre-Second-----
{% block second -%}
tracker_base is 'resolved': {{ tracker_base }}? {{ tracker_base == 'resolved' }}
tracker_middle is 'resolved': {{ tracker_middle }}? {{ tracker_middle == 'resolved' }}
tracker_test is 'resolved': {{ tracker_test }}? {{ tracker_test == 'resolved' }}
{%- endblock %}
-----Post-Second-----
Deferring tracker base.{# This message WILL show up in final output #}
{% set tracker_base = deferred %}
tracker_base is 'resolved': {{ tracker_base }}? {{ tracker_base == 'resolved' }}
tracker_middle is 'resolved': {{ tracker_middle }}? {{ tracker_middle == 'resolved' }}
tracker_test is 'resolved': {{ tracker_test }}? {{ tracker_test == 'resolved' }}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{% extends '../../eager/handles-deferred-used-in-multiple-block-levels/base.jinja' %}
{% set tracker_middle = '2_middle' %}
{% block first %}
I WON'T SHOW UP
{% endblock %}

{% block second %}
tracker_base is 'resolved': {{ tracker_base }}? {{ tracker_base == 'resolved' }}
tracker_middle is 'resolved': {{ tracker_middle }}? {{ tracker_middle == 'resolved' }}
tracker_test is 'resolved': {{ tracker_test }}? {{ tracker_test == 'resolved' }}
{% endblock %}
Deferring tracker middle.{# This message will not show up in final output #}
{% set tracker_middle = deferred %}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
tracker_base is '1_base': 1_base? true
tracker_middle is 'resolved': resolved? true
tracker_test is 'resolved': resolved? true
-----Pre-First-----

tracker_base is 'resolved': resolved? true
tracker_middle is 'resolved': resolved? true
tracker_test is 'resolved': resolved? true

-----Post-First-----
tracker_base is '1_base': 1_base? true
tracker_middle is 'resolved': resolved? true
tracker_test is 'resolved': resolved? true
-----Pre-Second-----

tracker_base is 'resolved': resolved? true
tracker_middle is 'resolved': resolved? true
tracker_test is 'resolved': resolved? true

-----Post-Second-----
Deferring tracker base.

tracker_base is 'resolved': resolved? true
tracker_middle is 'resolved': resolved? true
tracker_test is 'resolved': resolved? true
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
{# Start Label: ignored_output_from_extends #}{% do %}



Deferring tracker test.
{% set tracker_test = deferred %}





Deferring tracker middle.
{% set tracker_middle = deferred %}
{% enddo %}\
{# End Label: ignored_output_from_extends #}{% set current_path = 'eager/handles-deferred-used-in-multiple-block-levels/base.jinja' %}

tracker_base is '1_base': 1_base? true
tracker_middle is 'resolved': {{ tracker_middle }}\
? {{ tracker_middle == 'resolved' }}
tracker_test is 'resolved': {{ tracker_test }}\
? {{ tracker_test == 'resolved' }}
-----Pre-First-----
{% block first %}\
{% set __temp_meta_current_path_1057627035__,current_path = current_path,'eager/handles-deferred-used-in-multiple-block-levels/test.jinja' %}
tracker_base is 'resolved': {{ tracker_base }}\
? {{ tracker_base == 'resolved' }}
tracker_middle is 'resolved': {{ tracker_middle }}\
? {{ tracker_middle == 'resolved' }}
tracker_test is 'resolved': {{ tracker_test }}\
? {{ tracker_test == 'resolved' }}
{% set current_path,__temp_meta_current_path_1057627035__ = __temp_meta_current_path_1057627035__,null %}\
{% endblock first %}
-----Post-First-----
tracker_base is '1_base': 1_base? true
tracker_middle is 'resolved': {{ tracker_middle }}\
? {{ tracker_middle == 'resolved' }}
tracker_test is 'resolved': {{ tracker_test }}\
? {{ tracker_test == 'resolved' }}
-----Pre-Second-----
{% block second %}\
{% set __temp_meta_current_path_697061783__,current_path = current_path,'eager/handles-deferred-used-in-multiple-block-levels/middle.jinja' %}
tracker_base is 'resolved': {{ tracker_base }}\
? {{ tracker_base == 'resolved' }}
tracker_middle is 'resolved': {{ tracker_middle }}\
? {{ tracker_middle == 'resolved' }}
tracker_test is 'resolved': {{ tracker_test }}\
? {{ tracker_test == 'resolved' }}
{% set current_path,__temp_meta_current_path_697061783__ = __temp_meta_current_path_697061783__,null %}\
{% endblock second %}
-----Post-Second-----
Deferring tracker base.
{% set tracker_base = deferred %}
tracker_base is 'resolved': {{ tracker_base }}\
? {{ tracker_base == 'resolved' }}
tracker_middle is 'resolved': {{ tracker_middle }}\
? {{ tracker_middle == 'resolved' }}
tracker_test is 'resolved': {{ tracker_test }}\
? {{ tracker_test == 'resolved' }}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{% extends '../../eager/handles-deferred-used-in-multiple-block-levels/middle.jinja' %}

{% set tracker_test = '3_test' %}
{% block first %}
tracker_base is 'resolved': {{ tracker_base }}? {{ tracker_base == 'resolved' }}
tracker_middle is 'resolved': {{ tracker_middle }}? {{ tracker_middle == 'resolved' }}
tracker_test is 'resolved': {{ tracker_test }}? {{ tracker_test == 'resolved' }}
{% endblock %}
Deferring tracker test.{# This message will not show up in final output #}
{% set tracker_test = deferred %}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{% if deferred %}
{% set deferred_list = [] %}
{% endif %}
{% do deferred_list.append('Before block') %}
Deferred list after block is: {{ deferred_list }}
Deferred list after block should be: ['Before block']
-----Pre-First-----
{% block first -%}
{%- endblock %}
-----Post-First-----
{% do deferred_list.append('After block') %}
Deferred list after block is: {{ deferred_list }}
Deferred list after block should be: ['Before block', 'After block']
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
Deferred list after block is: ['Before block']
Deferred list after block should be: ['Before block']
-----Pre-First-----


Deferred list inside of block is: ['Before block', 'After block', 'In child block']
Deferred list inside of block should be: ['Before block', 'After block', 'In child block']

-----Post-First-----

Deferred list after block is: ['Before block', 'After block']
Deferred list after block should be: ['Before block', 'After block']
Loading
Loading