Skip to content

Commit b94b2db

Browse files
Maple Buiceclaude
andcommitted
Fix nested relative import resolution in EagerFromTag
Extends the nested relative import fix to eager execution mode. EagerFromTag had the same issue as FromTag - it wasn't managing currentPathStack for relative path resolution. Changes: - EagerFromTag now properly pushes/pops currentPathStack during template processing - Removed eager mode bypasses from tests since both modes now work correctly - Added specific test for eager mode nested relative imports This ensures consistent behavior between regular and eager execution modes for nested HubL relative imports. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]>
1 parent be87aa1 commit b94b2db

File tree

3 files changed

+52
-15
lines changed

3 files changed

+52
-15
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,15 @@ public String getEagerTagImage(TagToken tagToken, JinjavaInterpreter interpreter
9090
.newInstance(interpreter);
9191
child.getContext().put(Context.IMPORT_RESOURCE_PATH_KEY, templateFile);
9292
JinjavaInterpreter.pushCurrent(child);
93+
interpreter
94+
.getContext()
95+
.getCurrentPathStack()
96+
.push(templateFile, tagToken.getLineNumber(), tagToken.getStartPosition());
9397
String output;
9498
try {
9599
output = child.render(node);
96100
} finally {
101+
interpreter.getContext().getCurrentPathStack().pop();
97102
JinjavaInterpreter.popCurrent();
98103
}
99104

src/test/java/com/hubspot/jinjava/lib/tag/FromTagTest.java

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,6 @@ public void itDefersImport() {
114114

115115
@Test
116116
public void itResolvesNestedRelativeImports() throws Exception {
117-
if (interpreter.getConfig().getExecutionMode().useEagerParser()) {
118-
return;
119-
}
120117
jinjava.setResourceLocator(
121118
new ResourceLocator() {
122119
private final RelativePathResolver relativePathResolver =
@@ -169,9 +166,6 @@ public Optional<LocationResolver> getLocationResolver() {
169166

170167
@Test
171168
public void itMaintainsPathStackIntegrity() throws Exception {
172-
if (interpreter.getConfig().getExecutionMode().useEagerParser()) {
173-
return;
174-
}
175169
jinjava.setResourceLocator(
176170
new ResourceLocator() {
177171
private final RelativePathResolver relativePathResolver =
@@ -219,9 +213,6 @@ public Optional<LocationResolver> getLocationResolver() {
219213

220214
@Test
221215
public void itWorksWithIncludeAndFromTogether() throws Exception {
222-
if (interpreter.getConfig().getExecutionMode().useEagerParser()) {
223-
return;
224-
}
225216
jinjava.setResourceLocator(
226217
new ResourceLocator() {
227218
private final RelativePathResolver relativePathResolver =
@@ -275,9 +266,6 @@ public Optional<LocationResolver> getLocationResolver() {
275266

276267
@Test
277268
public void itResolvesUpAndAcrossDirectoryPaths() throws Exception {
278-
if (interpreter.getConfig().getExecutionMode().useEagerParser()) {
279-
return;
280-
}
281269
jinjava.setResourceLocator(
282270
new ResourceLocator() {
283271
private final RelativePathResolver relativePathResolver =
@@ -334,9 +322,6 @@ public Optional<LocationResolver> getLocationResolver() {
334322

335323
@Test
336324
public void itResolvesOriginalErrorCasePaths() throws Exception {
337-
if (interpreter.getConfig().getExecutionMode().useEagerParser()) {
338-
return;
339-
}
340325
jinjava.setResourceLocator(
341326
new ResourceLocator() {
342327
private final RelativePathResolver relativePathResolver =

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

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,4 +123,51 @@ public void itReconstructsCurrentPath() {
123123
@Ignore
124124
@Override
125125
public void itDefersImport() {}
126+
127+
@Test
128+
public void itResolvesNestedRelativeImportsInEagerMode() throws Exception {
129+
jinjava.setResourceLocator(
130+
new ResourceLocator() {
131+
private RelativePathResolver relativePathResolver = new RelativePathResolver();
132+
private final java.util.Map<String, String> templates =
133+
new java.util.HashMap<>() {
134+
{
135+
put(
136+
"root.jinja",
137+
"{% from 'sub/nested.jinja' import test_macro %}{{ test_macro() }}"
138+
);
139+
put(
140+
"sub/nested.jinja",
141+
"{% from '../helper.jinja' import helper %}{% macro test_macro() %}{{ helper() }}{% endmacro %}"
142+
);
143+
put("helper.jinja", "{% macro helper() %}HELPER{% endmacro %}");
144+
}
145+
};
146+
147+
@Override
148+
public String getString(
149+
String fullName,
150+
Charset encoding,
151+
JinjavaInterpreter interpreter
152+
) throws IOException {
153+
String template = templates.get(fullName);
154+
if (template == null) {
155+
throw new IOException("Template not found: " + fullName);
156+
}
157+
return template;
158+
}
159+
160+
@Override
161+
public Optional<LocationResolver> getLocationResolver() {
162+
return Optional.of(relativePathResolver);
163+
}
164+
}
165+
);
166+
167+
interpreter.getContext().getCurrentPathStack().push("root.jinja", 1, 0);
168+
String result = interpreter.render(interpreter.getResource("root.jinja"));
169+
170+
assertThat(interpreter.getErrors()).isEmpty();
171+
assertThat(result).contains("HELPER");
172+
}
126173
}

0 commit comments

Comments
 (0)