Add config to stop defaulting null datetime filter args to current time by boulter · Pull Request #1065 · HubSpot/jinjava · GitHub
Skip to content
Closed
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
25 changes: 25 additions & 0 deletions src/main/java/com/hubspot/jinjava/JinjavaConfig.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.hubspot.jinjava.lib.filter;

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;
Expand Down Expand Up @@ -73,15 +74,21 @@ private ZonedDateTime getZonedDateTime(Object var, String position) {
} else {
JinjavaInterpreter interpreter = JinjavaInterpreter.getCurrent();

interpreter.addError(
TemplateError.fromMissingFilterArgException(
new InvalidArgumentException(
interpreter,
getName() + " filter called with null " + position,
getName()
if (var == null) {
interpreter.addError(
TemplateError.fromMissingFilterArgException(
new InvalidArgumentException(
interpreter,
getName() + " filter called with null " + position,
getName()
)
)
)
);
);

if (!interpreter.getConfig().getUseCurrentTimeForNullDateTimeFilterArgs()) {
var = JinjavaConfig.DEFAULT_DATE_TIME_FILTER_ARG;
}
}

return Functions.getDateTimeArg(var, ZoneOffset.UTC);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,19 +94,23 @@ private DateTimeFormatter buildFormatter(String format) {
}
}

public void checkForNullVar(Object var, String name) {
public Object checkForNullVar(Object var, String name) {
JinjavaInterpreter interpreter = JinjavaInterpreter.getCurrent();

if (var == null) {
JinjavaInterpreter
.getCurrent()
.addError(
TemplateError.fromMissingFilterArgException(
new InvalidArgumentException(
JinjavaInterpreter.getCurrent(),
name,
name + " filter called with null value"
)
interpreter.addError(
TemplateError.fromMissingFilterArgException(
new InvalidArgumentException(
JinjavaInterpreter.getCurrent(),
name,
name + " filter called with null datetime"
)
);
)
);
if (!interpreter.getConfig().getUseCurrentTimeForNullDateTimeFilterArgs()) {
return JinjavaConfig.DEFAULT_DATE_TIME_FILTER_ARG;
}
}
return var;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,12 +48,11 @@ public class FormatDateFilter implements Filter {

@Override
public Object filter(Object var, JinjavaInterpreter interpreter, String... args) {
HELPER.checkForNullVar(var, NAME);
return format(var, args);
}

public static Object format(Object var, String... args) {
return HELPER.format(var, args);
return HELPER.format(HELPER.checkForNullVar(var, NAME), args);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,7 @@ public Object filter(Object var, JinjavaInterpreter interpreter, String... args)
}

public static Object format(Object var, String... args) {
HELPER.checkForNullVar(var, NAME);
return HELPER.format(var, args);
return HELPER.format(HELPER.checkForNullVar(var, NAME), args);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,7 @@ public Object filter(Object var, JinjavaInterpreter interpreter, String... args)
}

public static Object format(Object var, String... args) {
HELPER.checkForNullVar(var, NAME);
return HELPER.format(var, args);
return HELPER.format(HELPER.checkForNullVar(var, NAME), args);
}

@Override
Expand Down
34 changes: 22 additions & 12 deletions src/main/java/com/hubspot/jinjava/lib/fn/Functions.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public class Functions {
public static final String STRING_TO_DATE_FUNCTION = "stringToDate";

public static final int DEFAULT_RANGE_LIMIT = 1000;
private static final String DATETIMEFORMAT_FILTER = "datetimeformat";

@JinjavaDoc(
value = "Only usable within blocks, will render the contents of the parent block by calling super.",
Expand Down Expand Up @@ -187,14 +188,15 @@ public static ZonedDateTime today(String... var) {
public static String dateTimeFormat(Object var, String... format) {
ZoneId zoneOffset = ZoneId.of("UTC");

JinjavaInterpreter interpreter = JinjavaInterpreter.getCurrent();
if (format.length > 1 && format[1] != null) {
String timezone = format[1];
try {
zoneOffset = ZoneId.of(timezone);
} catch (DateTimeException e) {
throw new InvalidArgumentException(
JinjavaInterpreter.getCurrent(),
"datetimeformat",
interpreter,
DATETIMEFORMAT_FILTER,
String.format("Invalid timezone: %s", timezone)
);
}
Expand All @@ -205,17 +207,18 @@ public static String dateTimeFormat(Object var, String... format) {
}

if (var == null) {
JinjavaInterpreter
.getCurrent()
.addError(
TemplateError.fromMissingFilterArgException(
new InvalidArgumentException(
JinjavaInterpreter.getCurrent(),
"datetimeformat",
"datetimeformat filter called with null datetime"
)
interpreter.addError(
TemplateError.fromMissingFilterArgException(
new InvalidArgumentException(
interpreter,
DATETIMEFORMAT_FILTER,
DATETIMEFORMAT_FILTER + " filter called with null datetime"
)
);
)
);
if (!interpreter.getConfig().getUseCurrentTimeForNullDateTimeFilterArgs()) {
var = JinjavaConfig.DEFAULT_DATE_TIME_FILTER_ARG;
}
}

ZonedDateTime d = getDateTimeArg(var, zoneOffset);
Expand Down Expand Up @@ -299,6 +302,8 @@ public static ZonedDateTime getDateTimeArg(Object var, ZoneId zoneOffset) {
public static long unixtimestamp(Object... var) {
Object filterVar = var == null || var.length == 0 ? null : var[0];

JinjavaInterpreter interpreter = JinjavaInterpreter.getCurrent();

if (filterVar == null) {
JinjavaInterpreter
.getCurrent()
Expand All @@ -311,7 +316,12 @@ public static long unixtimestamp(Object... var) {
)
)
);

if (!interpreter.getConfig().getUseCurrentTimeForNullDateTimeFilterArgs()) {
filterVar = JinjavaConfig.DEFAULT_DATE_TIME_FILTER_ARG;
}
}

ZonedDateTime d = getDateTimeArg(filterVar, ZoneOffset.UTC);

if (d == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@

import com.google.common.collect.ImmutableMap;
import com.hubspot.jinjava.BaseInterpretingTest;
import com.hubspot.jinjava.Jinjava;
import com.hubspot.jinjava.JinjavaConfig;
import com.hubspot.jinjava.interpret.InvalidArgumentException;
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
import com.hubspot.jinjava.interpret.RenderResult;
import com.hubspot.jinjava.interpret.TemplateError;
import com.hubspot.jinjava.interpret.TemplateError.ErrorType;
Expand All @@ -29,6 +32,27 @@ public void setup() {
d = ZonedDateTime.parse("2013-11-06T14:22:00.000+00:00[UTC]");
}

@Test
public void itUsesDeprecationDateIfNoDateProvided() {
Jinjava jinjava = new Jinjava(
JinjavaConfig
.newBuilder()
.withUseCurrentTimeForNullDateTileFilterArgs(false)
.build()
);

JinjavaInterpreter interpreter = jinjava.newInterpreter();
JinjavaInterpreter.pushCurrent(interpreter);
try {
assertThat(filter.filter(null, interpreter))
.isEqualTo(StrftimeFormatter.format(JinjavaConfig.DEFAULT_DATE_TIME_FILTER_ARG));
assertThat(interpreter.getErrors().get(0).getMessage())
.contains("datetimeformat filter called with null datetime");
} finally {
JinjavaInterpreter.popCurrent();
}
}

@Test
public void itUsesTodayIfNoDateProvided() {
assertThat(filter.filter(null, interpreter))
Expand Down
Loading