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
4 changes: 4 additions & 0 deletions src/main/java/com/hubspot/jinjava/LegacyOverrides.java
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,10 @@ public Builder withUseSnakeCasePropertyNaming(boolean useSnakeCasePropertyNaming
return this;
}

/**
* Use {@link com.hubspot.jinjava.features.BuiltInFeatures#WHITESPACE_REQUIRED_WITHIN_TOKENS} instead
*/
@Deprecated
public Builder withWhitespaceRequiredWithinTokens(
boolean whitespaceRequiredWithinTokens
) {
Expand Down
11 changes: 11 additions & 0 deletions src/main/java/com/hubspot/jinjava/features/BuiltInFeatures.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.hubspot.jinjava.features;

public interface BuiltInFeatures {
String WHITESPACE_REQUIRED_WITHIN_TOKENS = "whitespace_required_within_tokens";
String FIXED_DATE_TIME_FILTER_NULL_ARG = "FIXED_DATE_TIME_FILTER_NULL_ARG";
String ECHO_UNDEFINED = "echoUndefined";
String PREVENT_ACCIDENTAL_EXPRESSIONS = "PREVENT_ACCIDENTAL_EXPRESSIONS";
String IGNORE_NESTED_INTERPRETATION_PARSE_ERRORS =
"IGNORE_NESTED_INTERPRETATION_PARSE_ERRORS";
String OUTPUT_UNDEFINED_VARIABLES_ERROR = "OUTPUT_UNDEFINED_VARIABLES_ERROR";
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ public boolean isActive(Context context) {
return ZonedDateTime.now().isAfter(activateAt);
}

@Override
public boolean isActive() {
return false; // Not usable without context
}

public ZonedDateTime getActivateAt() {
return activateAt;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,9 @@
import com.hubspot.jinjava.interpret.Context;

public interface FeatureActivationStrategy {
boolean isActive(Context context);
default boolean isActive(Context context) {
return isActive();
}

boolean isActive();
}
21 changes: 21 additions & 0 deletions src/main/java/com/hubspot/jinjava/features/FeatureConfig.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package com.hubspot.jinjava.features;

import com.google.common.collect.ImmutableMap;
import com.hubspot.jinjava.interpret.Context;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;

public class FeatureConfig {

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

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

@Deprecated
public Builder add(String name, Function<Context, Boolean> strategyFunction) {
features.put(
name,
new FeatureActivationStrategy() {
@Override
public boolean isActive(Context context) {
return strategyFunction.apply(context);
}

@Override
public boolean isActive() {
return false;
}
}
);
return this;
}

public Builder add(String name, FeatureActivationStrategy strategy) {
features.put(name, strategy);
return this;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@

public class FeatureStrategies {

public static final FeatureActivationStrategy INACTIVE = c -> false;
public static final FeatureActivationStrategy ACTIVE = c -> true;
public static final FeatureActivationStrategy INACTIVE = () -> false;
public static final FeatureActivationStrategy ACTIVE = () -> true;
}
4 changes: 4 additions & 0 deletions src/main/java/com/hubspot/jinjava/features/Features.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ public boolean isActive(String featureName, Context context) {
return getActivationStrategy(featureName).isActive(context);
}

public boolean isActive(String featureName) {
return getActivationStrategy(featureName).isActive();
}

public FeatureActivationStrategy getActivationStrategy(String featureName) {
return featureConfig.getFeature(featureName);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import com.hubspot.jinjava.el.ExpressionResolver;
import com.hubspot.jinjava.el.ext.DeferredParsingException;
import com.hubspot.jinjava.el.ext.ExtendedParser;
import com.hubspot.jinjava.features.BuiltInFeatures;
import com.hubspot.jinjava.interpret.AutoCloseableSupplier.AutoCloseableImpl;
import com.hubspot.jinjava.interpret.Context.TemporaryValueClosable;
import com.hubspot.jinjava.interpret.ContextConfigurationIF.ErrorHandlingStrategyIF;
Expand Down Expand Up @@ -87,9 +88,9 @@ public class JinjavaInterpreter implements PyishSerializable {
"ignored_output_from_extends";

public static final String OUTPUT_UNDEFINED_VARIABLES_ERROR =
"OUTPUT_UNDEFINED_VARIABLES_ERROR";
BuiltInFeatures.OUTPUT_UNDEFINED_VARIABLES_ERROR;
public static final String IGNORE_NESTED_INTERPRETATION_PARSE_ERRORS =
"IGNORE_NESTED_INTERPRETATION_PARSE_ERRORS";
BuiltInFeatures.IGNORE_NESTED_INTERPRETATION_PARSE_ERRORS;
private final Multimap<String, BlockInfo> blocks = ArrayListMultimap.create();
private final LinkedList<Node> extendParentRoots = new LinkedList<>();
private final Map<String, RevertibleObject> revertibleObjects = new HashMap<>();
Expand Down Expand Up @@ -288,9 +289,7 @@ public String renderFlat(String template, long renderLimit) {
private TemporaryValueClosable<ErrorHandlingStrategy> ignoreParseErrorsIfActivated() {
return config
.getFeatures()
.getActivationStrategy(
JinjavaInterpreter.IGNORE_NESTED_INTERPRETATION_PARSE_ERRORS
)
.getActivationStrategy(BuiltInFeatures.IGNORE_NESTED_INTERPRETATION_PARSE_ERRORS)
.isActive(context)
? context.withErrorHandlingStrategy(ErrorHandlingStrategyIF.ignoreAll())
: TemporaryValueClosable.noOp();
Expand Down Expand Up @@ -664,7 +663,7 @@ public Object retraceVariable(String variable, int lineNumber, int startPosition
if (
getConfig()
.getFeatures()
.getActivationStrategy(OUTPUT_UNDEFINED_VARIABLES_ERROR)
.getActivationStrategy(BuiltInFeatures.OUTPUT_UNDEFINED_VARIABLES_ERROR)
.isActive(context)
) {
addError(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.hubspot.jinjava.lib.expression;

import com.hubspot.jinjava.features.BuiltInFeatures;
import com.hubspot.jinjava.features.FeatureActivationStrategy;
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
import com.hubspot.jinjava.lib.filter.EscapeFilter;
Expand All @@ -12,7 +13,7 @@
public class DefaultExpressionStrategy implements ExpressionStrategy {

private static final long serialVersionUID = 436239440273704843L;
public static final String ECHO_UNDEFINED = "echoUndefined";
public static final String ECHO_UNDEFINED = BuiltInFeatures.ECHO_UNDEFINED;

public RenderedOutputNode interpretOutput(
ExpressionToken master,
Expand All @@ -26,7 +27,7 @@ public RenderedOutputNode interpretOutput(
final FeatureActivationStrategy feat = interpreter
.getConfig()
.getFeatures()
.getActivationStrategy(ECHO_UNDEFINED);
.getActivationStrategy(BuiltInFeatures.ECHO_UNDEFINED);

if (var == null && feat.isActive(interpreter.getContext())) {
return new RenderedOutputNode(master.getImage());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package com.hubspot.jinjava.lib.filter;

import static com.hubspot.jinjava.lib.filter.time.DateTimeFormatHelper.FIXED_DATE_TIME_FILTER_NULL_ARG;

import com.hubspot.jinjava.doc.annotations.JinjavaDoc;
import com.hubspot.jinjava.doc.annotations.JinjavaParam;
import com.hubspot.jinjava.doc.annotations.JinjavaSnippet;
import com.hubspot.jinjava.features.BuiltInFeatures;
import com.hubspot.jinjava.features.DateTimeFeatureActivationStrategy;
import com.hubspot.jinjava.features.FeatureActivationStrategy;
import com.hubspot.jinjava.interpret.InvalidArgumentException;
Expand Down Expand Up @@ -91,7 +90,7 @@ private ZonedDateTime getZonedDateTime(Object var, String position) {
FeatureActivationStrategy feat = interpreter
.getConfig()
.getFeatures()
.getActivationStrategy(FIXED_DATE_TIME_FILTER_NULL_ARG);
.getActivationStrategy(BuiltInFeatures.FIXED_DATE_TIME_FILTER_NULL_ARG);

if (feat.isActive(interpreter.getContext())) {
var = ((DateTimeFeatureActivationStrategy) feat).getActivateAt();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package com.hubspot.jinjava.lib.filter;

import static com.hubspot.jinjava.lib.filter.time.DateTimeFormatHelper.FIXED_DATE_TIME_FILTER_NULL_ARG;

import com.hubspot.jinjava.doc.annotations.JinjavaDoc;
import com.hubspot.jinjava.doc.annotations.JinjavaParam;
import com.hubspot.jinjava.doc.annotations.JinjavaSnippet;
import com.hubspot.jinjava.features.BuiltInFeatures;
import com.hubspot.jinjava.features.DateTimeFeatureActivationStrategy;
import com.hubspot.jinjava.features.FeatureActivationStrategy;
import com.hubspot.jinjava.interpret.InvalidArgumentException;
Expand Down Expand Up @@ -40,7 +39,7 @@ public Object filter(Object var, JinjavaInterpreter interpreter, String... args)
FeatureActivationStrategy feat = interpreter
.getConfig()
.getFeatures()
.getActivationStrategy(FIXED_DATE_TIME_FILTER_NULL_ARG);
.getActivationStrategy(BuiltInFeatures.FIXED_DATE_TIME_FILTER_NULL_ARG);

if (feat.isActive(interpreter.getContext())) {
var = ((DateTimeFeatureActivationStrategy) feat).getActivateAt();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.hubspot.jinjava.lib.filter.time;

import com.hubspot.jinjava.JinjavaConfig;
import com.hubspot.jinjava.features.BuiltInFeatures;
import com.hubspot.jinjava.features.DateTimeFeatureActivationStrategy;
import com.hubspot.jinjava.features.FeatureActivationStrategy;
import com.hubspot.jinjava.interpret.InvalidArgumentException;
Expand All @@ -21,7 +22,7 @@
public final class DateTimeFormatHelper {

public static final String FIXED_DATE_TIME_FILTER_NULL_ARG =
"FIXED_DATE_TIME_FILTER_NULL_ARG";
BuiltInFeatures.FIXED_DATE_TIME_FILTER_NULL_ARG;
private final String name;
private final Function<FormatStyle, DateTimeFormatter> cannedFormatterFunction;

Expand Down Expand Up @@ -118,7 +119,7 @@ public Object checkForNullVar(Object var, String name) {
FeatureActivationStrategy feat = interpreter
.getConfig()
.getFeatures()
.getActivationStrategy(FIXED_DATE_TIME_FILTER_NULL_ARG);
.getActivationStrategy(BuiltInFeatures.FIXED_DATE_TIME_FILTER_NULL_ARG);

return feat.isActive(interpreter.getContext())
? ((DateTimeFeatureActivationStrategy) feat).getActivateAt()
Expand Down
5 changes: 2 additions & 3 deletions src/main/java/com/hubspot/jinjava/lib/fn/Functions.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
package com.hubspot.jinjava.lib.fn;

import static com.hubspot.jinjava.lib.filter.time.DateTimeFormatHelper.FIXED_DATE_TIME_FILTER_NULL_ARG;

import com.google.common.collect.Lists;
import com.hubspot.jinjava.JinjavaConfig;
import com.hubspot.jinjava.doc.annotations.JinjavaDoc;
import com.hubspot.jinjava.doc.annotations.JinjavaParam;
import com.hubspot.jinjava.doc.annotations.JinjavaSnippet;
import com.hubspot.jinjava.el.ext.NamedParameter;
import com.hubspot.jinjava.features.BuiltInFeatures;
import com.hubspot.jinjava.features.DateTimeFeatureActivationStrategy;
import com.hubspot.jinjava.features.FeatureActivationStrategy;
import com.hubspot.jinjava.interpret.DeferredValueException;
Expand Down Expand Up @@ -229,7 +228,7 @@ public static String dateTimeFormat(Object var, String... format) {
FeatureActivationStrategy feat = interpreter
.getConfig()
.getFeatures()
.getActivationStrategy(FIXED_DATE_TIME_FILTER_NULL_ARG);
.getActivationStrategy(BuiltInFeatures.FIXED_DATE_TIME_FILTER_NULL_ARG);

if (feat.isActive(interpreter.getContext())) {
var = ((DateTimeFeatureActivationStrategy) feat).getActivateAt();
Expand Down
5 changes: 3 additions & 2 deletions src/main/java/com/hubspot/jinjava/tree/output/OutputList.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.hubspot.jinjava.tree.output;

import com.hubspot.jinjava.features.BuiltInFeatures;
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
import com.hubspot.jinjava.interpret.OutputTooBigException;
import com.hubspot.jinjava.interpret.TemplateError;
Expand All @@ -11,7 +12,7 @@
public class OutputList {

public static final String PREVENT_ACCIDENTAL_EXPRESSIONS =
"PREVENT_ACCIDENTAL_EXPRESSIONS";
BuiltInFeatures.PREVENT_ACCIDENTAL_EXPRESSIONS;
private final List<OutputNode> nodes = new LinkedList<>();
private final List<BlockPlaceholderOutputNode> blocks = new LinkedList<>();
private final long maxOutputSize;
Expand Down Expand Up @@ -58,7 +59,7 @@ public String getValue() {
.filter(config ->
config
.getFeatures()
.getActivationStrategy(PREVENT_ACCIDENTAL_EXPRESSIONS)
.getActivationStrategy(BuiltInFeatures.PREVENT_ACCIDENTAL_EXPRESSIONS)
.isActive(null)
)
.map(config ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

import com.google.common.collect.AbstractIterator;
import com.hubspot.jinjava.JinjavaConfig;
import com.hubspot.jinjava.features.BuiltInFeatures;

public class TokenScanner extends AbstractIterator<Token> {

Expand Down Expand Up @@ -93,7 +94,12 @@ private Token getNextToken() {
if (currPost < length) {
c = is[currPost];
boolean startTokenFound = true;
if (config.getLegacyOverrides().isWhitespaceRequiredWithinTokens()) {
if (
config
.getFeatures()
.isActive(BuiltInFeatures.WHITESPACE_REQUIRED_WITHIN_TOKENS) ||
config.getLegacyOverrides().isWhitespaceRequiredWithinTokens()
) {
boolean hasNextChar = (currPost + 1) < length;
boolean nextCharIsWhitespace = hasNextChar && (' ' == is[currPost + 1]);
startTokenFound = nextCharIsWhitespace;
Expand Down
2 changes: 1 addition & 1 deletion src/test/java/com/hubspot/jinjava/FeaturesTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public void setUp() throws Exception {
ZonedDateTime.of(LocalDateTime.MAX, ZoneId.systemDefault())
)
)
.add(DELEGATING, d -> delegateActive)
.add(DELEGATING, () -> delegateActive)
.build()
);
}
Expand Down