Skip to content

Commit

Permalink
feat(core): rename the json filter to jsonEncode
Browse files Browse the repository at this point in the history
  • Loading branch information
loicmathieu committed Jul 10, 2024
1 parent f35c979 commit 2051e0d
Show file tree
Hide file tree
Showing 5 changed files with 75 additions and 32 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
import org.apache.commons.io.IOUtils;

import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.*;
import java.util.regex.Pattern;
Expand All @@ -53,7 +52,7 @@ public class DocumentationGenerator {
@Override
public Map<String, Filter> getFilters() {
Map<String, Filter> filters = new HashMap<>();
filters.put("json", new JsonFilter());
filters.put("json", new JsonEncodeFilter());
return filters;
}
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ public Map<String, Filter> getFilters() {
filters.put("jq", new JqFilter());
filters.put("escapeChar", new EscapeCharFilter());
filters.put("json", new JsonFilter());
filters.put("jsonEncode", new JsonEncodeFilter());
filters.put("keys", new KeysFilter());
filters.put("number", new NumberFilter());
filters.put("urldecode", new UrlDecoderFilter());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package io.kestra.core.runners.pebble.filters;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.kestra.core.serializers.JacksonMapper;
import io.pebbletemplates.pebble.error.PebbleException;
import io.pebbletemplates.pebble.extension.Filter;
import io.pebbletemplates.pebble.template.EvaluationContext;
import io.pebbletemplates.pebble.template.PebbleTemplate;

import java.util.List;
import java.util.Map;

public class JsonEncodeFilter implements Filter {
private static final ObjectMapper MAPPER = JacksonMapper.ofJson();

@Override
public List<String> getArgumentNames() {
return null;
}

@Override
public Object apply(Object input, Map<String, Object> args, PebbleTemplate self, EvaluationContext context, int lineNumber) throws PebbleException {
if (input == null) {
return "null";
}

try {
return MAPPER.writeValueAsString(input);
} catch (JsonProcessingException e) {
throw new PebbleException(e, "Unable to transform to json value '" + input + "' with type '" + input.getClass().getName() + "'", lineNumber, self.getName());
}
}
}
Original file line number Diff line number Diff line change
@@ -1,34 +1,20 @@
package io.kestra.core.runners.pebble.filters;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.kestra.core.serializers.JacksonMapper;
import io.pebbletemplates.pebble.error.PebbleException;
import io.pebbletemplates.pebble.extension.Filter;
import io.pebbletemplates.pebble.template.EvaluationContext;
import io.pebbletemplates.pebble.template.PebbleTemplate;
import lombok.extern.slf4j.Slf4j;

import java.util.List;
import java.util.Map;

public class JsonFilter implements Filter {
private static final ObjectMapper MAPPER = JacksonMapper.ofJson();

@Override
public List<String> getArgumentNames() {
return null;
}
@Slf4j
@Deprecated
public class JsonFilter extends JsonEncodeFilter {

@Override
public Object apply(Object input, Map<String, Object> args, PebbleTemplate self, EvaluationContext context, int lineNumber) throws PebbleException {
if (input == null) {
return "null";
}
log.warn("The 'json' filter is deprecated, please use 'jsonEncode' instead");

try {
return MAPPER.writeValueAsString(input);
} catch (JsonProcessingException e) {
throw new PebbleException(e, "Unable to transform to json value '" + input + "' with type '" + input.getClass().getName() + "'", lineNumber, self.getName());
}
return super.apply(input, args, self, context, lineNumber);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,15 @@
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
import static org.hamcrest.Matchers.endsWith;
import static org.junit.jupiter.api.Assertions.assertThrows;

@KestraTest
class JsonFilterTest {
class JsonEncodeFilterTest {
@Inject
VariableRenderer variableRenderer;

@Test
void map() throws IllegalVariableEvaluationException {
void jsonEncodeFilter() throws IllegalVariableEvaluationException {
ZonedDateTime date = ZonedDateTime.parse("2013-09-08T16:19:00+02").withZoneSameLocal(ZoneId.systemDefault());

ImmutableMap<String, Object> vars = ImmutableMap.of(
Expand All @@ -46,33 +47,55 @@ void map() throws IllegalVariableEvaluationException {
))
);

String render = variableRenderer.render("{{ vars.second.string | json }}", vars);
String render = variableRenderer.render("{{ vars.second.string | jsonEncode }}", vars);
assertThat(render, is("\"string\""));

render = variableRenderer.render("{{ vars.second.int | json }}", vars);
render = variableRenderer.render("{{ vars.second.int | jsonEncode }}", vars);
assertThat(render, is("1"));

render = variableRenderer.render("{{ vars.second.float | json }}", vars);
render = variableRenderer.render("{{ vars.second.float | jsonEncode }}", vars);
assertThat(render, is("1.123"));

render = variableRenderer.render("{{ vars.second.list | json }}", vars);
render = variableRenderer.render("{{ vars.second.list | jsonEncode }}", vars);
assertThat(render, is("[\"string\",1,1.123]"));

render = variableRenderer.render("{{ vars.second.bool | json }}", vars);
render = variableRenderer.render("{{ vars.second.bool | jsonEncode }}", vars);
assertThat(render, is("true"));

render = variableRenderer.render("{{ vars.second.date | json }}", vars);
render = variableRenderer.render("{{ vars.second.date | jsonEncode }}", vars);
assertThat(render, is("\"" + date.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME) + "\""));

render = variableRenderer.render("{{ vars.second.map | json }}", vars);
render = variableRenderer.render("{{ vars.second.map | jsonEncode }}", vars);
assertThat(render, containsString("\"int\":1"));
assertThat(render, containsString("\"int\":1"));
assertThat(render, containsString("\"float\":1.123"));
assertThat(render, containsString("\"string\":\"string\""));
assertThat(render, startsWith("{"));
assertThat(render, endsWith("}"));

render = variableRenderer.render("{{ {\"empty_object\":{}} | json }}", Map.of());
render = variableRenderer.render("{{ {\"empty_object\":{}} | jsonEncode }}", Map.of());
assertThat(render, is("{\"empty_object\":{}}"));

render = variableRenderer.render("{{ null | jsonEncode }}", Map.of());
assertThat(render, is("null"));
}

@Test
void exception() {
assertThrows(IllegalVariableEvaluationException.class, () -> variableRenderer.render("{{ | jsonEncode }}", Map.of()));

assertThrows(IllegalVariableEvaluationException.class, () -> variableRenderer.render("{{ {not: json} | jsonEncode }}", Map.of()));
}

@Test
void jsonFilter() throws IllegalVariableEvaluationException {
ImmutableMap<String, Object> vars = ImmutableMap.of(
"vars", ImmutableMap.of("second", Map.of(
"string", "string"
))
);

String render = variableRenderer.render("{{ vars.second.string | jsonEncode }}", vars);
assertThat(render, is("\"string\""));
}
}

0 comments on commit 2051e0d

Please sign in to comment.