From 04e8e65969fc41c0b9630078fab221fb34771a6c Mon Sep 17 00:00:00 2001 From: Edward Vaisman <10497078+eddyv@users.noreply.github.com> Date: Tue, 12 Sep 2023 15:42:03 -0400 Subject: [PATCH 1/3] Adds a new case jsonproperty formatter for SCREAMING_SNAKE_CASE --- .../json/generator/DataObjectJsonGen.java | 3 + .../codegen/converter/DataObjectTest.java | 37 +++++++++---- .../ScreamingSnakeFormattedDataObject.java | 55 +++++++++++++++++++ .../codegen/format/ScreamingSnakeCase.java | 45 +++++++++++++++ .../java/io/vertx/test/codegen/CaseTest.java | 20 +++++++ 5 files changed, 150 insertions(+), 10 deletions(-) create mode 100644 vertx-codegen-json/src/test/java/io/vertx/test/codegen/converter/ScreamingSnakeFormattedDataObject.java create mode 100644 vertx-codegen-processor/src/main/java/io/vertx/codegen/format/ScreamingSnakeCase.java diff --git a/vertx-codegen-json/src/main/java/io/vertx/codegen/json/generator/DataObjectJsonGen.java b/vertx-codegen-json/src/main/java/io/vertx/codegen/json/generator/DataObjectJsonGen.java index 0cd8826f3..628ed2276 100644 --- a/vertx-codegen-json/src/main/java/io/vertx/codegen/json/generator/DataObjectJsonGen.java +++ b/vertx-codegen-json/src/main/java/io/vertx/codegen/json/generator/DataObjectJsonGen.java @@ -9,6 +9,7 @@ import io.vertx.codegen.format.KebabCase; import io.vertx.codegen.format.LowerCamelCase; import io.vertx.codegen.format.QualifiedCase; +import io.vertx.codegen.format.ScreamingSnakeCase; import io.vertx.codegen.format.SnakeCase; import io.vertx.codegen.type.AnnotationValueInfo; import io.vertx.codegen.type.ClassKind; @@ -382,6 +383,8 @@ private Case getCase(DataObjectModel model) { return CamelCase.INSTANCE; case "io.vertx.codegen.format.SnakeCase": return SnakeCase.INSTANCE; + case "io.vertx.codegen.format.ScreamingSnakeCase": + return ScreamingSnakeCase.INSTANCE; case "io.vertx.codegen.format.LowerCamelCase": return LowerCamelCase.INSTANCE; case "io.vertx.codegen.format.KebabCase": diff --git a/vertx-codegen-json/src/test/java/io/vertx/test/codegen/converter/DataObjectTest.java b/vertx-codegen-json/src/test/java/io/vertx/test/codegen/converter/DataObjectTest.java index a78656559..f8d43e624 100644 --- a/vertx-codegen-json/src/test/java/io/vertx/test/codegen/converter/DataObjectTest.java +++ b/vertx-codegen-json/src/test/java/io/vertx/test/codegen/converter/DataObjectTest.java @@ -30,12 +30,6 @@ */ public class DataObjectTest { - private static JsonObject toJson(Map map) { - JsonObject json = new JsonObject(); - map.forEach(json::put); - return json; - } - @Test public void testJsonToDataObject() throws Exception { @@ -331,6 +325,16 @@ public void testJsonToDataObject() throws Exception { // assertEquals(Collections.singletonList(aggregatedDataObject), obj.getAddedAggregatedDataObjects()); } + private String toBase64(Buffer buffer) { + return JsonUtil.BASE64_ENCODER.encodeToString(buffer.getBytes()); + } + + private static JsonObject toJson(Map map) { + JsonObject json = new JsonObject(); + map.forEach(json::put); + return json; + } + @Test public void testEmptyJsonToDataObject() { @@ -819,10 +823,6 @@ public void testNotInherit() { assertEquals(expectedJson, json); } - private String toBase64(Buffer buffer) { - return JsonUtil.BASE64_ENCODER.encodeToString(buffer.getBytes()); - } - @Test public void testPreferSetterToAdder() { SetterAdderDataObject obj = new SetterAdderDataObject(); @@ -849,6 +849,23 @@ public void testSnakeFormatted() { Assert.assertEquals(expected, test); } + @Test + public void testScreamingSnakeFormatted() { + ScreamingSnakeFormattedDataObject obj = new ScreamingSnakeFormattedDataObject(); + JsonObject expected = new JsonObject() + .put("FOO", "val1") + .put("FOO_BAR", "val2") + .put("FOO_BAR_JUU", "val3"); + ScreamingSnakeFormattedDataObjectConverter.fromJson(expected + , obj); + Assert.assertEquals("val1", obj.getFoo()); + Assert.assertEquals("val2", obj.getFooBar()); + Assert.assertEquals("val3", obj.getFooBarJuu()); + JsonObject test = new JsonObject(); + ScreamingSnakeFormattedDataObjectConverter.toJson(obj, test); + Assert.assertEquals(expected, test); + } + @Test public void testBase64Basic() { TestDataObjectBase64Basic obj = new TestDataObjectBase64Basic(); diff --git a/vertx-codegen-json/src/test/java/io/vertx/test/codegen/converter/ScreamingSnakeFormattedDataObject.java b/vertx-codegen-json/src/test/java/io/vertx/test/codegen/converter/ScreamingSnakeFormattedDataObject.java new file mode 100644 index 000000000..84c6dad36 --- /dev/null +++ b/vertx-codegen-json/src/test/java/io/vertx/test/codegen/converter/ScreamingSnakeFormattedDataObject.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2011-2017 Contributors to the Eclipse Foundation + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 + * which is available at https://www.apache.org/licenses/LICENSE-2.0. + * + * SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 + */ + +package io.vertx.test.codegen.converter; + +import io.vertx.codegen.annotations.DataObject; +import io.vertx.codegen.format.ScreamingSnakeCase; +import io.vertx.core.json.JsonObject; + +@DataObject(generateConverter = true, jsonPropertyNameFormatter = ScreamingSnakeCase.class) +public class ScreamingSnakeFormattedDataObject { + + private String foo; + private String fooBar; + private String fooBarJuu; + + public ScreamingSnakeFormattedDataObject() {} + + public ScreamingSnakeFormattedDataObject(JsonObject json) {} + + public String getFoo() { + return foo; + } + + public ScreamingSnakeFormattedDataObject setFoo(String foo) { + this.foo = foo; + return this; + } + + public String getFooBar() { + return fooBar; + } + + public ScreamingSnakeFormattedDataObject setFooBar(String fooBar) { + this.fooBar = fooBar; + return this; + } + + public String getFooBarJuu() { + return fooBarJuu; + } + + public ScreamingSnakeFormattedDataObject setFooBarJuu(String fooBarJuu) { + this.fooBarJuu = fooBarJuu; + return this; + } +} diff --git a/vertx-codegen-processor/src/main/java/io/vertx/codegen/format/ScreamingSnakeCase.java b/vertx-codegen-processor/src/main/java/io/vertx/codegen/format/ScreamingSnakeCase.java new file mode 100644 index 000000000..c5cc5fc4c --- /dev/null +++ b/vertx-codegen-processor/src/main/java/io/vertx/codegen/format/ScreamingSnakeCase.java @@ -0,0 +1,45 @@ +package io.vertx.codegen.format; + +import java.util.List; +import java.util.regex.Pattern; + +/** + * Snake case, for instance {@literal foo_bar}. + * + * @author Julien Viet + */ +public class ScreamingSnakeCase extends Case { + + /** A {@code SnakeCase} instance. */ + public static final Case INSTANCE = new ScreamingSnakeCase(); + + private final Pattern validator = + Pattern.compile("(?:[\\p{Upper}\\d]|(?:(?<=[\\p{Upper}\\d])_(?=[\\p{Upper}\\d])))*"); + + @Override + public String name() { + return "SCREAMING_SNAKE"; + } + + @Override + public String format(Iterable atoms) { + StringBuilder sb = new StringBuilder(); + for (String atom : atoms) { + if (atom.length() > 0) { + if (sb.length() > 0) { + sb.append('_'); + } + sb.append(atom.toUpperCase()); + } + } + return sb.toString(); + } + + @Override + public List parse(String name) { + if (!validator.matcher(name).matches()) { + throw new IllegalArgumentException("Invalid snake case:" + name); + } + return split(name, "_"); + } +} diff --git a/vertx-codegen-processor/src/test/java/io/vertx/test/codegen/CaseTest.java b/vertx-codegen-processor/src/test/java/io/vertx/test/codegen/CaseTest.java index 054053331..0e293c362 100644 --- a/vertx-codegen-processor/src/test/java/io/vertx/test/codegen/CaseTest.java +++ b/vertx-codegen-processor/src/test/java/io/vertx/test/codegen/CaseTest.java @@ -5,6 +5,7 @@ import io.vertx.codegen.format.KebabCase; import io.vertx.codegen.format.LowerCamelCase; import io.vertx.codegen.format.QualifiedCase; +import io.vertx.codegen.format.ScreamingSnakeCase; import io.vertx.codegen.format.SnakeCase; import org.junit.Test; @@ -130,6 +131,21 @@ public void testParseSnakeCase() { } } + @Test + public void testParseScreamingSnakeCase() { + parseScreamingSnakeCase(""); + parseScreamingSnakeCase("FOO", "FOO"); + parseScreamingSnakeCase("FOO_BAR", "FOO", "BAR"); + parseScreamingSnakeCase("FOO_BAR_JUU", "FOO", "BAR", "JUU"); + for (String test : Arrays.asList("_", "_FOO", "FOO_", "FOO__BAR")) { + try { + SnakeCase.INSTANCE.parse(test); + fail("Was expecting " + test + " to be rejected"); + } catch (Exception ignore) { + } + } + } + @Test public void testConversion() { assertEquals("foo-bar-juu", CamelCase.INSTANCE.to(KebabCase.INSTANCE, "FooBarJuu")); @@ -162,6 +178,10 @@ private void parseSnakeCase(String s, String... expected) { parseCase(SnakeCase.INSTANCE, s, expected); } + private void parseScreamingSnakeCase(String s, String... expected) { + parseCase(ScreamingSnakeCase.INSTANCE, s, expected); + } + private void parseCamelCase(String s, String... expected) { parseCase(CamelCase.INSTANCE, s, expected); } From f7935e37f3180d3456bfb14a11023efa023faefc Mon Sep 17 00:00:00 2001 From: Edward Vaisman <10497078+eddyv@users.noreply.github.com> Date: Tue, 12 Sep 2023 15:45:12 -0400 Subject: [PATCH 2/3] modify exception to include screaming --- .../main/java/io/vertx/codegen/format/ScreamingSnakeCase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vertx-codegen-processor/src/main/java/io/vertx/codegen/format/ScreamingSnakeCase.java b/vertx-codegen-processor/src/main/java/io/vertx/codegen/format/ScreamingSnakeCase.java index c5cc5fc4c..d406f2e16 100644 --- a/vertx-codegen-processor/src/main/java/io/vertx/codegen/format/ScreamingSnakeCase.java +++ b/vertx-codegen-processor/src/main/java/io/vertx/codegen/format/ScreamingSnakeCase.java @@ -38,7 +38,7 @@ public String format(Iterable atoms) { @Override public List parse(String name) { if (!validator.matcher(name).matches()) { - throw new IllegalArgumentException("Invalid snake case:" + name); + throw new IllegalArgumentException("Invalid screaming snake case:" + name); } return split(name, "_"); } From 4c279fdcf568f047338b607bc7bccc6e7a19d273 Mon Sep 17 00:00:00 2001 From: Edward Vaisman <10497078+eddyv@users.noreply.github.com> Date: Tue, 12 Sep 2023 15:58:11 -0400 Subject: [PATCH 3/3] update javadoc --- .../java/io/vertx/codegen/format/ScreamingSnakeCase.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/vertx-codegen-processor/src/main/java/io/vertx/codegen/format/ScreamingSnakeCase.java b/vertx-codegen-processor/src/main/java/io/vertx/codegen/format/ScreamingSnakeCase.java index d406f2e16..4873552d9 100644 --- a/vertx-codegen-processor/src/main/java/io/vertx/codegen/format/ScreamingSnakeCase.java +++ b/vertx-codegen-processor/src/main/java/io/vertx/codegen/format/ScreamingSnakeCase.java @@ -3,11 +3,7 @@ import java.util.List; import java.util.regex.Pattern; -/** - * Snake case, for instance {@literal foo_bar}. - * - * @author Julien Viet - */ +/** Screaming Snake case, for instance {@literal FOO_BAR}. */ public class ScreamingSnakeCase extends Case { /** A {@code SnakeCase} instance. */