Skip to content

Commit 79865cd

Browse files
authored
Merge pull request #1289 from HubSpot/builtin-features
Introduce BuiltinFeatures
2 parents 470185e + c855138 commit 79865cd

16 files changed

Lines changed: 80 additions & 26 deletions

src/main/java/com/hubspot/jinjava/LegacyOverrides.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,10 @@ public Builder withUseSnakeCasePropertyNaming(boolean useSnakeCasePropertyNaming
146146
return this;
147147
}
148148

149+
/**
150+
* Use {@link com.hubspot.jinjava.features.BuiltInFeatures#WHITESPACE_REQUIRED_WITHIN_TOKENS} instead
151+
*/
152+
@Deprecated
149153
public Builder withWhitespaceRequiredWithinTokens(
150154
boolean whitespaceRequiredWithinTokens
151155
) {
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.hubspot.jinjava.features;
2+
3+
public interface BuiltInFeatures {
4+
String WHITESPACE_REQUIRED_WITHIN_TOKENS = "whitespace_required_within_tokens";
5+
String FIXED_DATE_TIME_FILTER_NULL_ARG = "FIXED_DATE_TIME_FILTER_NULL_ARG";
6+
String ECHO_UNDEFINED = "echoUndefined";
7+
String PREVENT_ACCIDENTAL_EXPRESSIONS = "PREVENT_ACCIDENTAL_EXPRESSIONS";
8+
String IGNORE_NESTED_INTERPRETATION_PARSE_ERRORS =
9+
"IGNORE_NESTED_INTERPRETATION_PARSE_ERRORS";
10+
String OUTPUT_UNDEFINED_VARIABLES_ERROR = "OUTPUT_UNDEFINED_VARIABLES_ERROR";
11+
}

src/main/java/com/hubspot/jinjava/features/DateTimeFeatureActivationStrategy.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ public boolean isActive(Context context) {
2020
return ZonedDateTime.now().isAfter(activateAt);
2121
}
2222

23+
@Override
24+
public boolean isActive() {
25+
return false; // Not usable without context
26+
}
27+
2328
public ZonedDateTime getActivateAt() {
2429
return activateAt;
2530
}

src/main/java/com/hubspot/jinjava/features/FeatureActivationStrategy.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,9 @@
33
import com.hubspot.jinjava.interpret.Context;
44

55
public interface FeatureActivationStrategy {
6-
boolean isActive(Context context);
6+
default boolean isActive(Context context) {
7+
return isActive();
8+
}
9+
10+
boolean isActive();
711
}

src/main/java/com/hubspot/jinjava/features/FeatureConfig.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package com.hubspot.jinjava.features;
22

33
import com.google.common.collect.ImmutableMap;
4+
import com.hubspot.jinjava.interpret.Context;
45
import java.util.HashMap;
56
import java.util.Map;
7+
import java.util.function.Function;
68

79
public class FeatureConfig {
810

@@ -24,6 +26,25 @@ public static class Builder {
2426

2527
private final Map<String, FeatureActivationStrategy> features = new HashMap<>();
2628

29+
@Deprecated
30+
public Builder add(String name, Function<Context, Boolean> strategyFunction) {
31+
features.put(
32+
name,
33+
new FeatureActivationStrategy() {
34+
@Override
35+
public boolean isActive(Context context) {
36+
return strategyFunction.apply(context);
37+
}
38+
39+
@Override
40+
public boolean isActive() {
41+
return false;
42+
}
43+
}
44+
);
45+
return this;
46+
}
47+
2748
public Builder add(String name, FeatureActivationStrategy strategy) {
2849
features.put(name, strategy);
2950
return this;

src/main/java/com/hubspot/jinjava/features/FeatureStrategies.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22

33
public class FeatureStrategies {
44

5-
public static final FeatureActivationStrategy INACTIVE = c -> false;
6-
public static final FeatureActivationStrategy ACTIVE = c -> true;
5+
public static final FeatureActivationStrategy INACTIVE = () -> false;
6+
public static final FeatureActivationStrategy ACTIVE = () -> true;
77
}

src/main/java/com/hubspot/jinjava/features/Features.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ public boolean isActive(String featureName, Context context) {
1414
return getActivationStrategy(featureName).isActive(context);
1515
}
1616

17+
public boolean isActive(String featureName) {
18+
return getActivationStrategy(featureName).isActive();
19+
}
20+
1721
public FeatureActivationStrategy getActivationStrategy(String featureName) {
1822
return featureConfig.getFeature(featureName);
1923
}

src/main/java/com/hubspot/jinjava/interpret/JinjavaInterpreter.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import com.hubspot.jinjava.el.ExpressionResolver;
3131
import com.hubspot.jinjava.el.ext.DeferredParsingException;
3232
import com.hubspot.jinjava.el.ext.ExtendedParser;
33+
import com.hubspot.jinjava.features.BuiltInFeatures;
3334
import com.hubspot.jinjava.interpret.AutoCloseableSupplier.AutoCloseableImpl;
3435
import com.hubspot.jinjava.interpret.Context.TemporaryValueClosable;
3536
import com.hubspot.jinjava.interpret.ContextConfigurationIF.ErrorHandlingStrategyIF;
@@ -87,9 +88,9 @@ public class JinjavaInterpreter implements PyishSerializable {
8788
"ignored_output_from_extends";
8889

8990
public static final String OUTPUT_UNDEFINED_VARIABLES_ERROR =
90-
"OUTPUT_UNDEFINED_VARIABLES_ERROR";
91+
BuiltInFeatures.OUTPUT_UNDEFINED_VARIABLES_ERROR;
9192
public static final String IGNORE_NESTED_INTERPRETATION_PARSE_ERRORS =
92-
"IGNORE_NESTED_INTERPRETATION_PARSE_ERRORS";
93+
BuiltInFeatures.IGNORE_NESTED_INTERPRETATION_PARSE_ERRORS;
9394
private final Multimap<String, BlockInfo> blocks = ArrayListMultimap.create();
9495
private final LinkedList<Node> extendParentRoots = new LinkedList<>();
9596
private final Map<String, RevertibleObject> revertibleObjects = new HashMap<>();
@@ -288,9 +289,7 @@ public String renderFlat(String template, long renderLimit) {
288289
private TemporaryValueClosable<ErrorHandlingStrategy> ignoreParseErrorsIfActivated() {
289290
return config
290291
.getFeatures()
291-
.getActivationStrategy(
292-
JinjavaInterpreter.IGNORE_NESTED_INTERPRETATION_PARSE_ERRORS
293-
)
292+
.getActivationStrategy(BuiltInFeatures.IGNORE_NESTED_INTERPRETATION_PARSE_ERRORS)
294293
.isActive(context)
295294
? context.withErrorHandlingStrategy(ErrorHandlingStrategyIF.ignoreAll())
296295
: TemporaryValueClosable.noOp();
@@ -664,7 +663,7 @@ public Object retraceVariable(String variable, int lineNumber, int startPosition
664663
if (
665664
getConfig()
666665
.getFeatures()
667-
.getActivationStrategy(OUTPUT_UNDEFINED_VARIABLES_ERROR)
666+
.getActivationStrategy(BuiltInFeatures.OUTPUT_UNDEFINED_VARIABLES_ERROR)
668667
.isActive(context)
669668
) {
670669
addError(

src/main/java/com/hubspot/jinjava/lib/expression/DefaultExpressionStrategy.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.hubspot.jinjava.lib.expression;
22

3+
import com.hubspot.jinjava.features.BuiltInFeatures;
34
import com.hubspot.jinjava.features.FeatureActivationStrategy;
45
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
56
import com.hubspot.jinjava.lib.filter.EscapeFilter;
@@ -12,7 +13,7 @@
1213
public class DefaultExpressionStrategy implements ExpressionStrategy {
1314

1415
private static final long serialVersionUID = 436239440273704843L;
15-
public static final String ECHO_UNDEFINED = "echoUndefined";
16+
public static final String ECHO_UNDEFINED = BuiltInFeatures.ECHO_UNDEFINED;
1617

1718
public RenderedOutputNode interpretOutput(
1819
ExpressionToken master,
@@ -26,7 +27,7 @@ public RenderedOutputNode interpretOutput(
2627
final FeatureActivationStrategy feat = interpreter
2728
.getConfig()
2829
.getFeatures()
29-
.getActivationStrategy(ECHO_UNDEFINED);
30+
.getActivationStrategy(BuiltInFeatures.ECHO_UNDEFINED);
3031

3132
if (var == null && feat.isActive(interpreter.getContext())) {
3233
return new RenderedOutputNode(master.getImage());

src/main/java/com/hubspot/jinjava/lib/filter/BetweenTimesFilter.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
package com.hubspot.jinjava.lib.filter;
22

3-
import static com.hubspot.jinjava.lib.filter.time.DateTimeFormatHelper.FIXED_DATE_TIME_FILTER_NULL_ARG;
4-
53
import com.hubspot.jinjava.doc.annotations.JinjavaDoc;
64
import com.hubspot.jinjava.doc.annotations.JinjavaParam;
75
import com.hubspot.jinjava.doc.annotations.JinjavaSnippet;
6+
import com.hubspot.jinjava.features.BuiltInFeatures;
87
import com.hubspot.jinjava.features.DateTimeFeatureActivationStrategy;
98
import com.hubspot.jinjava.features.FeatureActivationStrategy;
109
import com.hubspot.jinjava.interpret.InvalidArgumentException;
@@ -91,7 +90,7 @@ private ZonedDateTime getZonedDateTime(Object var, String position) {
9190
FeatureActivationStrategy feat = interpreter
9291
.getConfig()
9392
.getFeatures()
94-
.getActivationStrategy(FIXED_DATE_TIME_FILTER_NULL_ARG);
93+
.getActivationStrategy(BuiltInFeatures.FIXED_DATE_TIME_FILTER_NULL_ARG);
9594

9695
if (feat.isActive(interpreter.getContext())) {
9796
var = ((DateTimeFeatureActivationStrategy) feat).getActivateAt();

0 commit comments

Comments
 (0)