Skip to content

Commit 024dde3

Browse files
authored
Merge pull request #1173 from HubSpot/parse-valid-deferred
find first valid deferred words
2 parents b910db5 + 7bd9f8a commit 024dde3

2 files changed

Lines changed: 49 additions & 3 deletions

File tree

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

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.hubspot.jinjava.lib.tag.eager;
22

33
import com.google.common.annotations.Beta;
4+
import com.google.common.base.Strings;
45
import com.hubspot.jinjava.interpret.CallStack;
56
import com.hubspot.jinjava.interpret.Context;
67
import com.hubspot.jinjava.interpret.DeferredLazyReference;
@@ -13,9 +14,11 @@
1314
import com.hubspot.jinjava.tree.parse.TokenScannerSymbols;
1415
import com.hubspot.jinjava.util.EagerExpressionResolver;
1516
import java.lang.reflect.InvocationTargetException;
17+
import java.util.Arrays;
1618
import java.util.Collection;
1719
import java.util.Collections;
1820
import java.util.HashSet;
21+
import java.util.List;
1922
import java.util.Map.Entry;
2023
import java.util.Set;
2124
import java.util.stream.Collectors;
@@ -40,7 +43,8 @@ public DeferredToken build() {
4043
token,
4144
usedDeferredWords != null
4245
? usedDeferredWords
43-
.map(prop -> prop.split("\\.", 2)[0])
46+
.map(DeferredToken::splitToken)
47+
.map(DeferredToken::getFirstNonEmptyToken)
4448
.distinct()
4549
.filter(word ->
4650
interpreter == null ||
@@ -50,7 +54,8 @@ public DeferredToken build() {
5054
: Collections.emptySet(),
5155
setDeferredWords != null
5256
? setDeferredWords
53-
.map(prop -> prop.split("\\.", 2)[0])
57+
.map(DeferredToken::splitToken)
58+
.map(DeferredToken::getFirstNonEmptyToken)
5459
.collect(Collectors.toSet())
5560
: Collections.emptySet(),
5661
acquireImportResourcePath(),
@@ -413,10 +418,19 @@ private static CallStack acquireMacroStack() {
413418
.orElse(null);
414419
}
415420

421+
private static String getFirstNonEmptyToken(List<String> strings) {
422+
return Strings.isNullOrEmpty(strings.get(0)) ? strings.get(1) : strings.get(0);
423+
}
424+
425+
public static List<String> splitToken(String token) {
426+
return Arrays.asList(token.split("\\."));
427+
}
428+
416429
public static Set<String> getBases(Set<String> original) {
417430
return original
418431
.stream()
419-
.map(prop -> prop.split("\\.", 2)[0])
432+
.map(DeferredToken::splitToken)
433+
.map(prop -> prop.get(0))
420434
.collect(Collectors.toSet());
421435
}
422436
}

src/test/java/com/hubspot/jinjava/util/DeferredValueUtilsTest.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,38 @@ public void itDefersUsedWordsInDeferredTokens() {
246246
assertThat(context.containsKey("int")).isFalse();
247247
}
248248

249+
@Test
250+
public void itFindsFirstValidDeferredWords() {
251+
DeferredToken deferredToken = DeferredToken
252+
.builderFromToken(
253+
new ExpressionToken("{{ blah }}", 1, 1, new DefaultTokenScannerSymbols())
254+
)
255+
.addUsedDeferredWords(ImmutableSet.of("deferred", ".attribute1"))
256+
.addSetDeferredWords(ImmutableSet.of("deferred", ".attribute2"))
257+
.build();
258+
259+
assertThat(deferredToken.getUsedDeferredWords())
260+
.isEqualTo(ImmutableSet.of("deferred", "attribute1"));
261+
assertThat(deferredToken.getSetDeferredWords())
262+
.isEqualTo(ImmutableSet.of("deferred", "attribute2"));
263+
}
264+
265+
@Test
266+
public void itFindsFirstValidDeferredWordsWithNestedAttributes() {
267+
DeferredToken deferredToken = DeferredToken
268+
.builderFromToken(
269+
new ExpressionToken("{{ blah }}", 1, 1, new DefaultTokenScannerSymbols())
270+
)
271+
.addUsedDeferredWords(ImmutableSet.of("deferred", ".attribute1.ignore"))
272+
.addSetDeferredWords(ImmutableSet.of("deferred", ".attribute2.ignoreme"))
273+
.build();
274+
275+
assertThat(deferredToken.getUsedDeferredWords())
276+
.isEqualTo(ImmutableSet.of("deferred", "attribute1"));
277+
assertThat(deferredToken.getSetDeferredWords())
278+
.isEqualTo(ImmutableSet.of("deferred", "attribute2"));
279+
}
280+
249281
private Context getContext(List<? extends Node> nodes) {
250282
return getContext(nodes, Optional.empty());
251283
}

0 commit comments

Comments
 (0)