From 468d50a467710c6a0910c49dc064d1d16561518f Mon Sep 17 00:00:00 2001 From: Jaehong Park <105151063+PHJ2000@users.noreply.github.com> Date: Thu, 22 Oct 2026 19:53:41 +0900 Subject: [PATCH] Allow the default filter value to be omitted Signed-off-by: Jaehong Park <105151063+PHJ2000@users.noreply.github.com> --- .../jinjava/lib/filter/DefaultFilter.java | 14 ++------ .../jinjava/lib/filter/DefaultFilterTest.java | 34 +++++++++++++++++++ 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/hubspot/jinjava/lib/filter/DefaultFilter.java b/src/main/java/com/hubspot/jinjava/lib/filter/DefaultFilter.java index d93170d6a..2eb697ce9 100644 --- a/src/main/java/com/hubspot/jinjava/lib/filter/DefaultFilter.java +++ b/src/main/java/com/hubspot/jinjava/lib/filter/DefaultFilter.java @@ -19,7 +19,6 @@ import com.hubspot.jinjava.doc.annotations.JinjavaParam; import com.hubspot.jinjava.doc.annotations.JinjavaSnippet; import com.hubspot.jinjava.interpret.JinjavaInterpreter; -import com.hubspot.jinjava.interpret.TemplateSyntaxException; import com.hubspot.jinjava.objects.PyWrapper; import com.hubspot.jinjava.util.ObjectTruthValue; import java.util.Map; @@ -36,8 +35,7 @@ @JinjavaParam( value = DefaultFilter.DEFAULT_VALUE_PARAM, type = "object", - desc = "Value to print when variable is not defined", - required = true + desc = "Value to print when variable is not defined; defaults to an empty string" ), @JinjavaParam( value = DefaultFilter.TRUTHY_PARAM, @@ -68,16 +66,8 @@ public Object filter( JinjavaInterpreter interpreter, Map parsedArgs ) { - if (parsedArgs.size() < 1) { - throw new TemplateSyntaxException( - interpreter, - getName(), - "requires either 1 (default value to use) or 2 (default value to use, default with variables that evaluate to false) arguments" - ); - } - boolean truthy = Boolean.TRUE.equals(parsedArgs.get(TRUTHY_PARAM)); - Object defaultValue = parsedArgs.get(DEFAULT_VALUE_PARAM); + Object defaultValue = parsedArgs.getOrDefault(DEFAULT_VALUE_PARAM, ""); if (truthy) { if (ObjectTruthValue.evaluate(object)) { diff --git a/src/test/java/com/hubspot/jinjava/lib/filter/DefaultFilterTest.java b/src/test/java/com/hubspot/jinjava/lib/filter/DefaultFilterTest.java index 0faa5d4bc..5d1e7a4f6 100644 --- a/src/test/java/com/hubspot/jinjava/lib/filter/DefaultFilterTest.java +++ b/src/test/java/com/hubspot/jinjava/lib/filter/DefaultFilterTest.java @@ -18,6 +18,40 @@ public void setup() { jinjava.getGlobalContext().registerClasses(DefaultFilter.class); } + @Test + public void itKeepsDefinedValuesWithoutADefaultArgument() { + assertThat(jinjava.render("{{ 'a' | default }}", new HashMap<>())).isEqualTo("a"); + assertThat(jinjava.render("{{ 0 | default() }}", new HashMap<>())).isEqualTo("0"); + } + + @Test + public void itDefaultsUndefinedValuesToAnEmptyString() { + assertThat( + jinjava.render( + "{% set value = missing | default %}{{ type(value) }}:{{ value | length }}", + new HashMap<>() + ) + ) + .isEqualTo("str:0"); + } + + @Test + public void itDefaultsFalsyValuesWithoutAnExplicitDefault() { + assertThat( + jinjava.render( + "{% set value = false | default(truthy=True) %}{{ type(value) }}:{{ value | length }}", + new HashMap<>() + ) + ) + .isEqualTo("str:0"); + } + + @Test + public void itAllowsOmittedArgumentsForTheAlias() { + assertThat(jinjava.render("{{ 'a' | d }}:{{ missing | d }}", new HashMap<>())) + .isEqualTo("a:"); + } + @Test public void itSetsDefaultStringValues() { assertThat(