Skip to content

Commit 963ad10

Browse files
authored
Merge pull request #1117 from HubSpot/allow-macro-alias-in-from-tag
Support aliasing macro function names in {% from %} tag
2 parents 15f33ad + 4a01731 commit 963ad10

4 files changed

Lines changed: 28 additions & 28 deletions

File tree

src/main/java/com/hubspot/jinjava/lib/tag/FromTag.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,11 @@ public static boolean integrateChild(
167167
Object val = child.getContext().getGlobalMacro(importMapping.getKey());
168168

169169
if (val != null) {
170-
interpreter.getContext().addGlobalMacro((MacroFunction) val);
170+
MacroFunction toImport = (MacroFunction) val;
171+
if (!importMapping.getKey().equals(importMapping.getValue())) {
172+
toImport = new MacroFunction(toImport, importMapping.getValue());
173+
}
174+
interpreter.getContext().addGlobalMacro(toImport);
171175
} else {
172176
val = child.getContext().get(importMapping.getKey());
173177

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

Lines changed: 11 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,10 @@
1313
import com.hubspot.jinjava.tree.parse.TagToken;
1414
import com.hubspot.jinjava.util.EagerReconstructionUtils;
1515
import java.io.IOException;
16-
import java.util.HashSet;
1716
import java.util.List;
1817
import java.util.Map;
18+
import java.util.Map.Entry;
1919
import java.util.Optional;
20-
import java.util.Set;
2120
import java.util.stream.Collectors;
2221

2322
@Beta
@@ -100,11 +99,10 @@ public String getEagerTagImage(TagToken tagToken, JinjavaInterpreter interpreter
10099
}
101100

102101
FromTag.integrateChild(imports, child, interpreter);
103-
Map<String, String> newToOldImportNames = renameMacros(imports, interpreter)
104-
.entrySet()
105-
.stream()
106-
.filter(e -> !e.getKey().equals(e.getValue()))
107-
.collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey));
102+
Map<String, String> newToOldImportNames = getNewToOldWithoutMacros(
103+
imports,
104+
interpreter
105+
);
108106
if (child.getContext().getDeferredTokens().isEmpty() || output == null) {
109107
return "";
110108
} else if (newToOldImportNames.size() > 0) {
@@ -132,33 +130,19 @@ public String getEagerTagImage(TagToken tagToken, JinjavaInterpreter interpreter
132130
}
133131
}
134132

135-
private static Map<String, String> renameMacros(
133+
private static Map<String, String> getNewToOldWithoutMacros(
136134
Map<String, String> oldToNewImportNames,
137135
JinjavaInterpreter interpreter
138136
) {
139-
Set<String> toRemove = new HashSet<>();
140-
Map<String, MacroFunction> macroFunctions = oldToNewImportNames
137+
return oldToNewImportNames
141138
.entrySet()
142139
.stream()
140+
.filter(e -> !e.getKey().equals(e.getValue()))
143141
.filter(
144142
e ->
145-
!e.getKey().equals(e.getValue()) &&
146-
!interpreter.getContext().containsKey(e.getKey()) &&
147-
interpreter.getContext().isGlobalMacro(e.getKey())
143+
interpreter.getContext().containsKey(e.getValue()) ||
144+
!interpreter.getContext().isGlobalMacro(e.getValue())
148145
)
149-
.peek(entry -> toRemove.add(entry.getKey()))
150-
.collect(
151-
Collectors.toMap(
152-
Map.Entry::getValue,
153-
e -> interpreter.getContext().getGlobalMacro(e.getKey())
154-
)
155-
);
156-
157-
macroFunctions.forEach(
158-
(key, value) ->
159-
interpreter.getContext().addGlobalMacro(new MacroFunction(value, key))
160-
);
161-
toRemove.forEach(oldToNewImportNames::remove);
162-
return oldToNewImportNames;
146+
.collect(Collectors.toMap(Entry::getValue, Entry::getKey)); // flip order
163147
}
164148
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,14 @@ public void importedContextExposesVars() {
5858
.contains("wrap-padding: padding-left:42px;padding-right:42px");
5959
}
6060

61+
@Test
62+
public void itImportsAliasedMacroName() {
63+
assertThat(fixture("from-alias-macro"))
64+
.contains("wrap-spacer:")
65+
.contains("<td height=\"42\">")
66+
.contains("wrap-padding: padding-left:42px;padding-right:42px");
67+
}
68+
6169
@Test
6270
public void importedCycleDected() {
6371
fixture("from-recursion");
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{% from "pegasus-importable.jinja" import wrap_padding as wp, spacer as sp %}
2+
3+
wrap-padding: {{ wp }}
4+
wrap-spacer: {{ sp() }}

0 commit comments

Comments
 (0)