Skip to content

Commit c9f6128

Browse files
committed
Change to only use allow_snake_case filter when the serialization isn't directly for output
1 parent dfde72a commit c9f6128

3 files changed

Lines changed: 31 additions & 28 deletions

File tree

src/main/java/com/hubspot/jinjava/objects/serialization/BothCasingBeanSerializer.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,11 @@ public void serialize(
2828
throws IOException {
2929
if (
3030
Boolean.TRUE.equals(
31-
serializerProvider.getAttribute(PyishObjectMapper.EAGER_EXECUTION_ATTRIBUTE)
31+
serializerProvider.getAttribute(PyishObjectMapper.ALLOW_SNAKE_CASE_ATTRIBUTE)
3232
)
3333
) {
34+
// if it's directly for output, then we don't want to add the additional filter characters,
35+
// as doing so would make the "|allow_snake_case" appear in the final output.
3436
StringBuilder sb = new StringBuilder();
3537
sb
3638
.append(PyishSerializable.writeValueAsString(value))

src/main/java/com/hubspot/jinjava/objects/serialization/PyishObjectMapper.java

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
public class PyishObjectMapper {
2121
public static final ObjectWriter PYISH_OBJECT_WRITER;
22-
public static final String EAGER_EXECUTION_ATTRIBUTE = "eagerExecution";
22+
public static final String ALLOW_SNAKE_CASE_ATTRIBUTE = "allowSnakeCase";
2323

2424
static {
2525
ObjectMapper mapper = new ObjectMapper(
@@ -37,14 +37,18 @@ public class PyishObjectMapper {
3737

3838
public static String getAsUnquotedPyishString(Object val) {
3939
if (val != null) {
40-
return WhitespaceUtils.unquoteAndUnescape(getAsPyishString(val));
40+
return WhitespaceUtils.unquoteAndUnescape(getAsPyishString(val, true));
4141
}
4242
return "";
4343
}
4444

4545
public static String getAsPyishString(Object val) {
46+
return getAsPyishString(val, false);
47+
}
48+
49+
private static String getAsPyishString(Object val, boolean forOutput) {
4650
try {
47-
return getAsPyishStringOrThrow(val);
51+
return getAsPyishStringOrThrow(val, forOutput);
4852
} catch (IOException e) {
4953
if (e instanceof LengthLimitingJsonProcessingException) {
5054
throw new OutputTooBigException(
@@ -57,6 +61,11 @@ public static String getAsPyishString(Object val) {
5761
}
5862

5963
public static String getAsPyishStringOrThrow(Object val) throws IOException {
64+
return getAsPyishStringOrThrow(val, false);
65+
}
66+
67+
public static String getAsPyishStringOrThrow(Object val, boolean forOutput)
68+
throws IOException {
6069
ObjectWriter objectWriter = PYISH_OBJECT_WRITER;
6170
Writer writer;
6271
Optional<Long> maxOutputSize = JinjavaInterpreter
@@ -77,13 +86,7 @@ public static String getAsPyishStringOrThrow(Object val) throws IOException {
7786
writer = new CharArrayWriter();
7887
}
7988
objectWriter
80-
.withAttribute(
81-
EAGER_EXECUTION_ATTRIBUTE,
82-
JinjavaInterpreter
83-
.getCurrentMaybe()
84-
.map(interpreter -> interpreter.getConfig().getExecutionMode().useEagerParser())
85-
.orElse(false)
86-
)
89+
.withAttribute(ALLOW_SNAKE_CASE_ATTRIBUTE, !forOutput)
8790
.writeValue(writer, val);
8891
return writer.toString();
8992
}

src/test/java/com/hubspot/jinjava/objects/serialization/PyishObjectMapperTest.java

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
import com.google.common.collect.ImmutableMap;
88
import com.hubspot.jinjava.Jinjava;
99
import com.hubspot.jinjava.JinjavaConfig;
10+
import com.hubspot.jinjava.LegacyOverrides;
1011
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
11-
import com.hubspot.jinjava.mode.EagerExecutionMode;
1212
import com.hubspot.jinjava.objects.collections.SizeLimitingPyMap;
1313
import java.util.ArrayList;
1414
import java.util.HashMap;
@@ -92,25 +92,23 @@ public void itLimitsDepth() {
9292

9393
@Test
9494
public void itSerializesToSnakeCaseAccessibleMap() {
95-
try {
96-
Jinjava jinjava = new Jinjava(
97-
JinjavaConfig
98-
.newBuilder()
99-
.withExecutionMode(EagerExecutionMode.instance())
100-
.build()
101-
);
102-
JinjavaInterpreter.pushCurrent(jinjava.newInterpreter());
103-
assertThat(PyishObjectMapper.getAsPyishString(new Foo("bar")))
104-
.isEqualTo("{'fooBar': 'bar'} |allow_snake_case");
105-
} finally {
106-
JinjavaInterpreter.popCurrent();
107-
}
95+
assertThat(PyishObjectMapper.getAsPyishString(new Foo("bar")))
96+
.isEqualTo("{'fooBar': 'bar'} |allow_snake_case");
10897
}
10998

11099
@Test
111-
public void itDoesNotConvertToSnakeCaseMapInDefaultExecutionMode() {
112-
assertThat(PyishObjectMapper.getAsPyishString(new Foo("bar")).trim())
113-
.isEqualTo("{'fooBar': 'bar'}");
100+
public void itDoesNotConvertToSnakeCaseMapWhenResultIsForOutput() {
101+
Jinjava jinjava = new Jinjava(
102+
JinjavaConfig
103+
.newBuilder()
104+
.withLegacyOverrides(
105+
LegacyOverrides.newBuilder().withUsePyishObjectMapper(true).build()
106+
)
107+
.build()
108+
);
109+
JinjavaInterpreter interpreter = jinjava.newInterpreter();
110+
interpreter.getContext().put("foo", new Foo("bar"));
111+
assertThat(interpreter.render("{{ foo }}")).isEqualTo("{'fooBar': 'bar'}");
114112
}
115113

116114
static class Foo {

0 commit comments

Comments
 (0)