Skip to content

Commit bcdb8fd

Browse files
committed
Keep LegacyOverrides as a class rather than immutable
1 parent cca1a54 commit bcdb8fd

6 files changed

Lines changed: 160 additions & 47 deletions

File tree

Lines changed: 129 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,14 @@
11
package com.hubspot.jinjava;
22

3-
import org.immutables.value.Value;
4-
53
/**
64
* This class allows Jinjava to be configured to override legacy behaviour.
75
* LegacyOverrides.NONE signifies that none of the legacy functionality will be overridden.
86
* LegacyOverrides.ALL signifies that all new functionality will be used; avoid legacy "bugs".
97
*/
10-
@Value.Immutable(singleton = true)
11-
@JinjavaImmutableStyle.WithStyle
12-
public interface LegacyOverrides extends WithLegacyOverrides {
13-
LegacyOverrides NONE = new Builder().build();
14-
LegacyOverrides THREE_POINT_0 = new Builder()
8+
public class LegacyOverrides {
9+
10+
public static final LegacyOverrides NONE = new LegacyOverrides.Builder().build();
11+
public static final LegacyOverrides THREE_POINT_0 = new Builder()
1512
.withEvaluateMapKeys(true)
1613
.withIterateOverMapKeys(true)
1714
.withUsePyishObjectMapper(true)
@@ -22,7 +19,7 @@ public interface LegacyOverrides extends WithLegacyOverrides {
2219
.withUseTrimmingForNotesAndExpressions(true)
2320
.withKeepNullableLoopValues(true)
2421
.build();
25-
LegacyOverrides ALL = new Builder()
22+
public static final LegacyOverrides ALL = new LegacyOverrides.Builder()
2623
.withEvaluateMapKeys(true)
2724
.withIterateOverMapKeys(true)
2825
.withUsePyishObjectMapper(true)
@@ -33,59 +30,151 @@ public interface LegacyOverrides extends WithLegacyOverrides {
3330
.withUseTrimmingForNotesAndExpressions(true)
3431
.withKeepNullableLoopValues(true)
3532
.build();
33+
private final boolean evaluateMapKeys;
34+
private final boolean iterateOverMapKeys;
35+
private final boolean usePyishObjectMapper;
36+
private final boolean useSnakeCasePropertyNaming;
37+
private final boolean useNaturalOperatorPrecedence;
38+
private final boolean parseWhitespaceControlStrictly;
39+
private final boolean allowAdjacentTextNodes;
40+
private final boolean useTrimmingForNotesAndExpressions;
41+
private final boolean keepNullableLoopValues;
3642

37-
@Value.Default
38-
default boolean isEvaluateMapKeys() {
39-
return false;
43+
private LegacyOverrides(Builder builder) {
44+
evaluateMapKeys = builder.evaluateMapKeys;
45+
iterateOverMapKeys = builder.iterateOverMapKeys;
46+
usePyishObjectMapper = builder.usePyishObjectMapper;
47+
useSnakeCasePropertyNaming = builder.useSnakeCasePropertyNaming;
48+
useNaturalOperatorPrecedence = builder.useNaturalOperatorPrecedence;
49+
parseWhitespaceControlStrictly = builder.parseWhitespaceControlStrictly;
50+
allowAdjacentTextNodes = builder.allowAdjacentTextNodes;
51+
useTrimmingForNotesAndExpressions = builder.useTrimmingForNotesAndExpressions;
52+
keepNullableLoopValues = builder.keepNullableLoopValues;
4053
}
4154

42-
@Value.Default
43-
default boolean isIterateOverMapKeys() {
44-
return false;
55+
public static Builder newBuilder() {
56+
return new Builder();
4557
}
4658

47-
@Value.Default
48-
default boolean isUsePyishObjectMapper() {
49-
return false;
59+
public boolean isEvaluateMapKeys() {
60+
return evaluateMapKeys;
5061
}
5162

52-
@Value.Default
53-
default boolean isUseSnakeCasePropertyNaming() {
54-
return false;
63+
public boolean isIterateOverMapKeys() {
64+
return iterateOverMapKeys;
5565
}
5666

57-
@Value.Default
58-
default boolean isUseNaturalOperatorPrecedence() {
59-
return false;
67+
public boolean isUsePyishObjectMapper() {
68+
return usePyishObjectMapper;
6069
}
6170

62-
@Value.Default
63-
default boolean isParseWhitespaceControlStrictly() {
64-
return false;
71+
public boolean isUseSnakeCasePropertyNaming() {
72+
return useSnakeCasePropertyNaming;
6573
}
6674

67-
@Value.Default
68-
default boolean isAllowAdjacentTextNodes() {
69-
return false;
75+
public boolean isUseNaturalOperatorPrecedence() {
76+
return useNaturalOperatorPrecedence;
7077
}
7178

72-
@Value.Default
73-
default boolean isUseTrimmingForNotesAndExpressions() {
74-
return false;
79+
public boolean isParseWhitespaceControlStrictly() {
80+
return parseWhitespaceControlStrictly;
7581
}
7682

77-
@Value.Default
78-
default boolean isKeepNullableLoopValues() {
79-
return false;
83+
public boolean isAllowAdjacentTextNodes() {
84+
return allowAdjacentTextNodes;
8085
}
8186

82-
class Builder extends ImmutableLegacyOverrides.Builder {}
87+
public boolean isUseTrimmingForNotesAndExpressions() {
88+
return useTrimmingForNotesAndExpressions;
89+
}
8390

84-
static Builder newBuilder() {
85-
return builder();
91+
public boolean isKeepNullableLoopValues() {
92+
return keepNullableLoopValues;
8693
}
8794

88-
static Builder builder() {
89-
return new Builder();
95+
public static class Builder {
96+
97+
private boolean evaluateMapKeys = false;
98+
private boolean iterateOverMapKeys = false;
99+
private boolean usePyishObjectMapper = false;
100+
private boolean useSnakeCasePropertyNaming = false;
101+
private boolean useNaturalOperatorPrecedence = false;
102+
private boolean parseWhitespaceControlStrictly = false;
103+
private boolean allowAdjacentTextNodes = false;
104+
private boolean useTrimmingForNotesAndExpressions = false;
105+
private boolean keepNullableLoopValues = false;
106+
107+
private Builder() {}
108+
109+
public LegacyOverrides build() {
110+
return new LegacyOverrides(this);
111+
}
112+
113+
public static Builder from(LegacyOverrides legacyOverrides) {
114+
return new Builder()
115+
.withEvaluateMapKeys(legacyOverrides.evaluateMapKeys)
116+
.withIterateOverMapKeys(legacyOverrides.iterateOverMapKeys)
117+
.withUsePyishObjectMapper(legacyOverrides.usePyishObjectMapper)
118+
.withUseSnakeCasePropertyNaming(legacyOverrides.useSnakeCasePropertyNaming)
119+
.withUseNaturalOperatorPrecedence(legacyOverrides.useNaturalOperatorPrecedence)
120+
.withParseWhitespaceControlStrictly(
121+
legacyOverrides.parseWhitespaceControlStrictly
122+
)
123+
.withAllowAdjacentTextNodes(legacyOverrides.allowAdjacentTextNodes)
124+
.withUseTrimmingForNotesAndExpressions(
125+
legacyOverrides.useTrimmingForNotesAndExpressions
126+
);
127+
}
128+
129+
public Builder withEvaluateMapKeys(boolean evaluateMapKeys) {
130+
this.evaluateMapKeys = evaluateMapKeys;
131+
return this;
132+
}
133+
134+
public Builder withIterateOverMapKeys(boolean iterateOverMapKeys) {
135+
this.iterateOverMapKeys = iterateOverMapKeys;
136+
return this;
137+
}
138+
139+
public Builder withUsePyishObjectMapper(boolean usePyishObjectMapper) {
140+
this.usePyishObjectMapper = usePyishObjectMapper;
141+
return this;
142+
}
143+
144+
public Builder withUseSnakeCasePropertyNaming(boolean useSnakeCasePropertyNaming) {
145+
this.useSnakeCasePropertyNaming = useSnakeCasePropertyNaming;
146+
return this;
147+
}
148+
149+
public Builder withUseNaturalOperatorPrecedence(
150+
boolean useNaturalOperatorPrecedence
151+
) {
152+
this.useNaturalOperatorPrecedence = useNaturalOperatorPrecedence;
153+
return this;
154+
}
155+
156+
public Builder withParseWhitespaceControlStrictly(
157+
boolean parseWhitespaceControlStrictly
158+
) {
159+
this.parseWhitespaceControlStrictly = parseWhitespaceControlStrictly;
160+
return this;
161+
}
162+
163+
public Builder withAllowAdjacentTextNodes(boolean allowAdjacentTextNodes) {
164+
this.allowAdjacentTextNodes = allowAdjacentTextNodes;
165+
return this;
166+
}
167+
168+
public Builder withUseTrimmingForNotesAndExpressions(
169+
boolean useTrimmingForNotesAndExpressions
170+
) {
171+
this.useTrimmingForNotesAndExpressions = useTrimmingForNotesAndExpressions;
172+
return this;
173+
}
174+
175+
public Builder withKeepNullableLoopValues(boolean keepNullableLoopValues) {
176+
this.keepNullableLoopValues = keepNullableLoopValues;
177+
return this;
178+
}
90179
}
91180
}

src/test/java/com/hubspot/jinjava/el/ExtendedSyntaxBuilderTest.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,12 @@ public void mapLiteral() {
196196
BaseJinjavaTest
197197
.newConfigBuilder()
198198
.withMaxOutputSize(MAX_STRING_LENGTH)
199-
.withLegacyOverrides(LegacyOverrides.THREE_POINT_0.withEvaluateMapKeys(false))
199+
.withLegacyOverrides(
200+
LegacyOverrides.Builder
201+
.from(LegacyOverrides.THREE_POINT_0)
202+
.withEvaluateMapKeys(false)
203+
.build()
204+
)
200205
.build()
201206
)
202207
.newInterpreter();

src/test/java/com/hubspot/jinjava/interpret/JinjavaInterpreterTest.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,10 @@ public void itInterpretsEmptyExpressions() {
387387
.newConfigBuilder()
388388
.withTimeZone(ZoneId.of("America/New_York"))
389389
.withLegacyOverrides(
390-
LegacyOverrides.THREE_POINT_0.withParseWhitespaceControlStrictly(false)
390+
LegacyOverrides.Builder
391+
.from(LegacyOverrides.THREE_POINT_0)
392+
.withParseWhitespaceControlStrictly(false)
393+
.build()
391394
)
392395
.build()
393396
);

src/test/java/com/hubspot/jinjava/objects/collections/PyMapTest.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,12 @@ public void itDoesntUpdateKeysWithVariableNameWhenLegacy() {
359359
new Jinjava(
360360
BaseJinjavaTest
361361
.newConfigBuilder()
362-
.withLegacyOverrides(LegacyOverrides.THREE_POINT_0.withEvaluateMapKeys(false))
362+
.withLegacyOverrides(
363+
LegacyOverrides.Builder
364+
.from(LegacyOverrides.THREE_POINT_0)
365+
.withEvaluateMapKeys(false)
366+
.build()
367+
)
363368
.build()
364369
);
365370
assertThat(

src/test/java/com/hubspot/jinjava/tree/TreeParserTest.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,10 @@ public void itTrimsNotes() {
257257
BaseJinjavaTest
258258
.newConfigBuilder()
259259
.withLegacyOverrides(
260-
LegacyOverrides.THREE_POINT_0.withUseTrimmingForNotesAndExpressions(false)
260+
LegacyOverrides.Builder
261+
.from(LegacyOverrides.THREE_POINT_0)
262+
.withUseTrimmingForNotesAndExpressions(false)
263+
.build()
261264
)
262265
.build()
263266
)
@@ -349,7 +352,10 @@ public void itTrimsExpressions() {
349352
BaseJinjavaTest
350353
.newConfigBuilder()
351354
.withLegacyOverrides(
352-
LegacyOverrides.THREE_POINT_0.withUseTrimmingForNotesAndExpressions(false)
355+
LegacyOverrides.Builder
356+
.from(LegacyOverrides.THREE_POINT_0)
357+
.withUseTrimmingForNotesAndExpressions(false)
358+
.build()
353359
)
354360
.build()
355361
)
@@ -368,7 +374,10 @@ public void itDoesNotMergeAdjacentTextNodesWhenLegacyOverrideIsApplied() {
368374
BaseJinjavaTest
369375
.newConfigBuilder()
370376
.withLegacyOverrides(
371-
LegacyOverrides.THREE_POINT_0.withAllowAdjacentTextNodes(false)
377+
LegacyOverrides.Builder
378+
.from(LegacyOverrides.THREE_POINT_0)
379+
.withAllowAdjacentTextNodes(false)
380+
.build()
372381
)
373382
.build()
374383
)

src/test/java/com/hubspot/jinjava/util/ObjectIteratorTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,9 @@ public void testItIteratesOverValues() {
103103
public void testItIteratesOverKeys() throws Exception {
104104
JinjavaConfig config = BaseJinjavaTest
105105
.newConfigBuilder()
106-
.withLegacyOverrides(LegacyOverrides.builder().withIterateOverMapKeys(true).build())
106+
.withLegacyOverrides(
107+
LegacyOverrides.newBuilder().withIterateOverMapKeys(true).build()
108+
)
107109
.build();
108110
JinjavaInterpreter.pushCurrent(
109111
new JinjavaInterpreter(new Jinjava(), new Context(), config)

0 commit comments

Comments
 (0)