From 5aac759493d0bb2416cf99cbe1aefd01b3ea0358 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sat, 14 Jun 2025 21:46:09 +0900 Subject: [PATCH 01/13] Update kogera version --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index d8d577a1..8dc2e27c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -18,7 +18,7 @@ val jacksonVersion = libs.versions.jackson.get() val generatedSrcPath = "${layout.buildDirectory.get()}/generated/kotlin" group = groupStr -version = "${jacksonVersion}-beta25" +version = "${jacksonVersion}-beta26" repositories { mavenCentral() From 13429c0ed239ada3b37f68f955dc9c632e35d223 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 15 Jun 2025 10:09:58 +0900 Subject: [PATCH 02/13] Add exhaustive tests for JsonValue usage in value class --- .../valueClass/jsonValue/NonNullObjectTest.kt | 85 +++++++++++++++++++ .../jsonValue/NullableObjectTest.kt | 55 ++++++++++++ .../jsonValue/NullablePrimitiveTest.kt | 55 ++++++++++++ .../ser/valueClass/jsonValue/PrimitiveTest.kt | 85 +++++++++++++++++++ .../jsonValue/TwoUnitPrimitiveTest.kt | 85 +++++++++++++++++++ 5 files changed, 365 insertions(+) create mode 100644 src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonValue/NonNullObjectTest.kt create mode 100644 src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonValue/NullableObjectTest.kt create mode 100644 src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonValue/NullablePrimitiveTest.kt create mode 100644 src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonValue/PrimitiveTest.kt create mode 100644 src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonValue/TwoUnitPrimitiveTest.kt diff --git a/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonValue/NonNullObjectTest.kt b/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonValue/NonNullObjectTest.kt new file mode 100644 index 00000000..c44073d3 --- /dev/null +++ b/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonValue/NonNullObjectTest.kt @@ -0,0 +1,85 @@ +package io.github.projectmapk.jackson.module.kogera.zIntegration.ser.valueClass.jsonValue + +import com.fasterxml.jackson.annotation.JsonValue +import io.github.projectmapk.jackson.module.kogera.defaultMapper +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Nested +import org.junit.jupiter.api.Test + +class NonNullObjectTest { + @JvmInline + value class NonNull(val v: String) { + @JsonValue + fun jsonValue() = v + "_modified" + } + + data class NonNullDto(val v: NonNull) + + @Nested + inner class NonNullTest { + @Test + fun direct() { + assertEquals( + "\"test_modified\"", + defaultMapper.writeValueAsString(NonNull("test")), + ) + } + + @Test + fun asProperty() { + assertEquals( + """{"v":"test_modified"}""", + defaultMapper.writeValueAsString(NonNullDto(NonNull("test"))), + ) + } + } + + @JvmInline + value class Nullable(val v: String) { + @JsonValue + fun jsonValue() = v.takeIf { it.length % 2 == 0 }?.let { it + "_modified" } + } + + data class NullableDto(val v: Nullable) + + @Nested + inner class NullableTest { + @Nested + inner class DirectTest { + @Test + fun nonNull() { + assertEquals( + "\"even_modified\"", + defaultMapper.writeValueAsString(Nullable("even")), + ) + } + + @Test + fun `null`() { + assertEquals( + "null", + defaultMapper.writeValueAsString(Nullable("odd")), + ) + } + } + + @Nested + inner class AsPropertyTest { + @Test + fun nonNull() { + assertEquals( + """{"v":"even_modified"}""", + defaultMapper.writeValueAsString(NullableDto(Nullable("even"))), + ) + } + + @Test + fun `null`() { + assertEquals( + """{"v":null}""", + defaultMapper.writeValueAsString(NullableDto(Nullable("odd"))), + ) + } + } + } +} diff --git a/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonValue/NullableObjectTest.kt b/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonValue/NullableObjectTest.kt new file mode 100644 index 00000000..a76cd4ab --- /dev/null +++ b/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonValue/NullableObjectTest.kt @@ -0,0 +1,55 @@ +package io.github.projectmapk.jackson.module.kogera.zIntegration.ser.valueClass.jsonValue + +import com.fasterxml.jackson.annotation.JsonValue +import io.github.projectmapk.jackson.module.kogera.defaultMapper +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Nested +import org.junit.jupiter.api.Test + +class NullableObjectTest { + @JvmInline + value class Value(val v: String?) { + @JsonValue + fun jsonValue() = v?.let { it + "_modified" } + } + + @Nested + inner class DirectTest { + @Test + fun nonNull() { + assertEquals( + "\"test_modified\"", + defaultMapper.writeValueAsString(Value("test")), + ) + } + + @Test + fun `null`() { + assertEquals( + "null", + defaultMapper.writeValueAsString(Value(null)), + ) + } + } + + data class Dto(val v: Value) + + @Nested + inner class AsPropertyTest { + @Test + fun nonNull() { + assertEquals( + """{"v":"test_modified"}""", + defaultMapper.writeValueAsString(Dto(Value("test"))), + ) + } + + @Test + fun `null`() { + assertEquals( + """{"v":null}""", + defaultMapper.writeValueAsString(Dto(Value(null))), + ) + } + } +} diff --git a/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonValue/NullablePrimitiveTest.kt b/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonValue/NullablePrimitiveTest.kt new file mode 100644 index 00000000..a895e480 --- /dev/null +++ b/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonValue/NullablePrimitiveTest.kt @@ -0,0 +1,55 @@ +package io.github.projectmapk.jackson.module.kogera.zIntegration.ser.valueClass.jsonValue + +import com.fasterxml.jackson.annotation.JsonValue +import io.github.projectmapk.jackson.module.kogera.defaultMapper +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Nested +import org.junit.jupiter.api.Test + +class NullablePrimitiveTest { + @JvmInline + value class Value(val v: Int?) { + @JsonValue + fun jsonValue() = v?.let { it + 100 } + } + + @Nested + inner class DirectTest { + @Test + fun nonNull() { + assertEquals( + "100", + defaultMapper.writeValueAsString(Value(0)), + ) + } + + @Test + fun `null`() { + assertEquals( + "null", + defaultMapper.writeValueAsString(Value(null)), + ) + } + } + + data class Dto(val v: Value) + + @Nested + inner class AsPropertyTest { + @Test + fun nonNull() { + assertEquals( + """{"v":100}""", + defaultMapper.writeValueAsString(Dto(Value(0))), + ) + } + + @Test + fun `null`() { + assertEquals( + """{"v":null}""", + defaultMapper.writeValueAsString(Dto(Value(null))), + ) + } + } +} diff --git a/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonValue/PrimitiveTest.kt b/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonValue/PrimitiveTest.kt new file mode 100644 index 00000000..52027222 --- /dev/null +++ b/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonValue/PrimitiveTest.kt @@ -0,0 +1,85 @@ +package io.github.projectmapk.jackson.module.kogera.zIntegration.ser.valueClass.jsonValue + +import com.fasterxml.jackson.annotation.JsonValue +import io.github.projectmapk.jackson.module.kogera.defaultMapper +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Nested +import org.junit.jupiter.api.Test + +class PrimitiveTest { + @JvmInline + value class NonNull(val v: Int) { + @JsonValue + fun jsonValue() = v + 100 + } + + data class NonNullDto(val v: NonNull) + + @Nested + inner class NonNullTest { + @Test + fun direct() { + assertEquals( + "100", + defaultMapper.writeValueAsString(NonNull(0)), + ) + } + + @Test + fun asProperty() { + assertEquals( + """{"v":100}""", + defaultMapper.writeValueAsString(NonNullDto(NonNull(0))), + ) + } + } + + @JvmInline + value class Nullable(val v: Int) { + @JsonValue + fun jsonValue() = v.takeIf { it % 2 == 0 }?.let { it + 100 } + } + + data class NullableDto(val v: Nullable) + + @Nested + inner class NullableTest { + @Nested + inner class DirectTest { + @Test + fun nonNull() { + assertEquals( + "100", + defaultMapper.writeValueAsString(Nullable(0)), + ) + } + + @Test + fun `null`() { + assertEquals( + "null", + defaultMapper.writeValueAsString(Nullable(1)), + ) + } + } + + @Nested + inner class AsPropertyTest { + @Test + fun nonNull() { + assertEquals( + """{"v":100}""", + defaultMapper.writeValueAsString(NullableDto(Nullable(0))), + ) + } + + @Test + fun `null`() { + assertEquals( + """{"v":null}""", + defaultMapper.writeValueAsString(NullableDto(Nullable(1))), + ) + } + } + } +} diff --git a/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonValue/TwoUnitPrimitiveTest.kt b/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonValue/TwoUnitPrimitiveTest.kt new file mode 100644 index 00000000..da12b04b --- /dev/null +++ b/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonValue/TwoUnitPrimitiveTest.kt @@ -0,0 +1,85 @@ +package io.github.projectmapk.jackson.module.kogera.zIntegration.ser.valueClass.jsonValue + +import com.fasterxml.jackson.annotation.JsonValue +import io.github.projectmapk.jackson.module.kogera.defaultMapper +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Nested +import org.junit.jupiter.api.Test + +class TwoUnitPrimitiveTest { + @JvmInline + value class NonNull(val v: Long) { + @JsonValue + fun jsonValue() = v + 100 + } + + data class NonNullDto(val v: NonNull) + + @Nested + inner class NonNullTest { + @Test + fun direct() { + assertEquals( + "100", + defaultMapper.writeValueAsString(NonNull(0)), + ) + } + + @Test + fun asProperty() { + assertEquals( + """{"v":100}""", + defaultMapper.writeValueAsString(NonNullDto(NonNull(0))), + ) + } + } + + @JvmInline + value class Nullable(val v: Long) { + @JsonValue + fun jsonValue() = v.takeIf { it % 2L == 0L }?.let { it + 100 } + } + + data class NullableDto(val v: Nullable) + + @Nested + inner class NullableTest { + @Nested + inner class DirectTest { + @Test + fun nonNull() { + assertEquals( + "100", + defaultMapper.writeValueAsString(Nullable(0)), + ) + } + + @Test + fun `null`() { + assertEquals( + "null", + defaultMapper.writeValueAsString(Nullable(1)), + ) + } + } + + @Nested + inner class AsPropertyTest { + @Test + fun nonNull() { + assertEquals( + """{"v":100}""", + defaultMapper.writeValueAsString(NullableDto(Nullable(0))), + ) + } + + @Test + fun `null`() { + assertEquals( + """{"v":null}""", + defaultMapper.writeValueAsString(NullableDto(Nullable(1))), + ) + } + } + } +} From cc1b397a9bcd24135bcb7bd6d7aec5b5368ec906 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 15 Jun 2025 10:42:51 +0900 Subject: [PATCH 03/13] Add exhaustive tests for JsonKey usage in value class --- .../valueClass/jsonKey/NonNullObjectTest.kt | 37 ++++++++++++++++++ .../valueClass/jsonKey/NullableObjectTest.kt | 23 +++++++++++ .../jsonKey/NullablePrimitiveTest.kt | 23 +++++++++++ .../ser/valueClass/jsonKey/PrimitiveTest.kt | 37 ++++++++++++++++++ .../jsonKey/TwoUnitPrimitiveTest.kt | 38 +++++++++++++++++++ 5 files changed, 158 insertions(+) create mode 100644 src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonKey/NonNullObjectTest.kt create mode 100644 src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonKey/NullableObjectTest.kt create mode 100644 src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonKey/NullablePrimitiveTest.kt create mode 100644 src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonKey/PrimitiveTest.kt create mode 100644 src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonKey/TwoUnitPrimitiveTest.kt diff --git a/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonKey/NonNullObjectTest.kt b/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonKey/NonNullObjectTest.kt new file mode 100644 index 00000000..f4207562 --- /dev/null +++ b/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonKey/NonNullObjectTest.kt @@ -0,0 +1,37 @@ +package io.github.projectmapk.jackson.module.kogera.zIntegration.ser.valueClass.jsonKey + +import com.fasterxml.jackson.annotation.JsonKey +import io.github.projectmapk.jackson.module.kogera.defaultMapper +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test + +class NonNullObjectTest { + @JvmInline + value class NonNull(val v: String) { + @JsonKey + fun jsonValue() = v + "_modified" + } + + @Test + fun nonNullTest() { + assertEquals( + """{"test_modified":null}""", + defaultMapper.writeValueAsString(mapOf(NonNull("test") to null)), + ) + } + + @JvmInline + value class Nullable(val v: String) { + @JsonKey + fun jsonValue() = v.takeIf { it.length % 2 == 0 }?.let { it + "_modified" } + } + + // The case of returning null as a key is unnecessary because it will result in an error + @Test + fun nullableTest() { + assertEquals( + """{"test_modified":null}""", + defaultMapper.writeValueAsString(mapOf(Nullable("test") to null)), + ) + } +} diff --git a/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonKey/NullableObjectTest.kt b/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonKey/NullableObjectTest.kt new file mode 100644 index 00000000..50f2326b --- /dev/null +++ b/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonKey/NullableObjectTest.kt @@ -0,0 +1,23 @@ +package io.github.projectmapk.jackson.module.kogera.zIntegration.ser.valueClass.jsonKey + +import com.fasterxml.jackson.annotation.JsonKey +import io.github.projectmapk.jackson.module.kogera.defaultMapper +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test + +class NullableObjectTest { + @JvmInline + value class Value(val v: String?) { + @JsonKey + fun jsonValue() = v?.let { it + "_modified" } + } + + // The case of returning null as a key is unnecessary because it will result in an error + @Test + fun test() { + assertEquals( + """{"test_modified":null}""", + defaultMapper.writeValueAsString(mapOf(Value("test") to null)), + ) + } +} diff --git a/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonKey/NullablePrimitiveTest.kt b/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonKey/NullablePrimitiveTest.kt new file mode 100644 index 00000000..a12e79d4 --- /dev/null +++ b/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonKey/NullablePrimitiveTest.kt @@ -0,0 +1,23 @@ +package io.github.projectmapk.jackson.module.kogera.zIntegration.ser.valueClass.jsonKey + +import com.fasterxml.jackson.annotation.JsonKey +import io.github.projectmapk.jackson.module.kogera.defaultMapper +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test + +class NullablePrimitiveTest { + @JvmInline + value class Value(val v: Int?) { + @JsonKey + fun jsonValue() = v?.let { it + 100 } + } + + // The case of returning null as a key is unnecessary because it will result in an error + @Test + fun test() { + assertEquals( + """{"100":null}""", + defaultMapper.writeValueAsString(mapOf(Value(0) to null)), + ) + } +} diff --git a/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonKey/PrimitiveTest.kt b/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonKey/PrimitiveTest.kt new file mode 100644 index 00000000..9aba8b18 --- /dev/null +++ b/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonKey/PrimitiveTest.kt @@ -0,0 +1,37 @@ +package io.github.projectmapk.jackson.module.kogera.zIntegration.ser.valueClass.jsonKey + +import com.fasterxml.jackson.annotation.JsonKey +import io.github.projectmapk.jackson.module.kogera.defaultMapper +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test + +class PrimitiveTest { + @JvmInline + value class NonNull(val v: Int) { + @JsonKey + fun jsonValue() = v + 100 + } + + @Test + fun nonNullTest() { + assertEquals( + """{"100":null}""", + defaultMapper.writeValueAsString(mapOf(NonNull(0) to null)), + ) + } + + @JvmInline + value class Nullable(val v: Int) { + @JsonKey + fun jsonValue() = v.takeIf { it % 2 == 0 }?.let { it + 100 } + } + + // The case of returning null as a key is unnecessary because it will result in an error + @Test + fun nullableTest() { + assertEquals( + """{"100":null}""", + defaultMapper.writeValueAsString(mapOf(Nullable(0) to null)), + ) + } +} diff --git a/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonKey/TwoUnitPrimitiveTest.kt b/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonKey/TwoUnitPrimitiveTest.kt new file mode 100644 index 00000000..9b8bbc7f --- /dev/null +++ b/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonKey/TwoUnitPrimitiveTest.kt @@ -0,0 +1,38 @@ +package io.github.projectmapk.jackson.module.kogera.zIntegration.ser.valueClass.jsonKey + +import com.fasterxml.jackson.annotation.JsonKey +import io.github.projectmapk.jackson.module.kogera.defaultMapper +import io.github.projectmapk.jackson.module.kogera.zIntegration.ser.valueClass.jsonKey.PrimitiveTest.NonNull +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test + +class TwoUnitPrimitiveTest { + @JvmInline + value class NonNull(val v: Long) { + @JsonKey + fun jsonValue() = v + 100 + } + + @Test + fun nonNullTest() { + assertEquals( + """{"100":null}""", + defaultMapper.writeValueAsString(mapOf(NonNull(0) to null)), + ) + } + + @JvmInline + value class Nullable(val v: Long) { + @JsonKey + fun jsonValue() = v.takeIf { it % 2L == 0L }?.let { it + 100 } + } + + // The case of returning null as a key is unnecessary because it will result in an error + @Test + fun nullableTest() { + assertEquals( + """{"100":null}""", + defaultMapper.writeValueAsString(mapOf(Nullable(0) to null)), + ) + } +} From 2ac2a313a9a1acd5000e771e83313bb9b7507047 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 15 Jun 2025 11:17:51 +0900 Subject: [PATCH 04/13] Remove unused import --- .../zIntegration/ser/valueClass/jsonKey/TwoUnitPrimitiveTest.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonKey/TwoUnitPrimitiveTest.kt b/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonKey/TwoUnitPrimitiveTest.kt index 9b8bbc7f..8a657764 100644 --- a/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonKey/TwoUnitPrimitiveTest.kt +++ b/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zIntegration/ser/valueClass/jsonKey/TwoUnitPrimitiveTest.kt @@ -2,7 +2,6 @@ package io.github.projectmapk.jackson.module.kogera.zIntegration.ser.valueClass. import com.fasterxml.jackson.annotation.JsonKey import io.github.projectmapk.jackson.module.kogera.defaultMapper -import io.github.projectmapk.jackson.module.kogera.zIntegration.ser.valueClass.jsonKey.PrimitiveTest.NonNull import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test From cb8296acf522903453c4eeab4b82206f5cdb1325 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 15 Jun 2025 13:20:15 +0900 Subject: [PATCH 05/13] Add guidelines for junie --- .junie/guidelines.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .junie/guidelines.md diff --git a/.junie/guidelines.md b/.junie/guidelines.md new file mode 100644 index 00000000..b6d842b1 --- /dev/null +++ b/.junie/guidelines.md @@ -0,0 +1,6 @@ +# Spring Boot +## 1. Perform formatting just before completing the task + +```bash +./gradlew formatKotlin +``` From 1a37a0952788c733974820c8b09798e3c6d3a0fc Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 15 Jun 2025 13:24:28 +0900 Subject: [PATCH 06/13] Update test-main.yml --- .github/workflows/test-main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-main.yml b/.github/workflows/test-main.yml index e5a08200..f3b99c99 100644 --- a/.github/workflows/test-main.yml +++ b/.github/workflows/test-main.yml @@ -42,7 +42,7 @@ jobs: # LTS versions, latest version (if exists) java-version: [ '17', '21', '24' ] # Minimum version, latest release version, latest pre-release version (if exists) - kotlin: ['2.0.21', '2.1.20', '2.2.0-RC'] + kotlin: ['2.0.21', '2.1.20', '2.2.0-RC2'] env: KOTLIN_VERSION: ${{ matrix.kotlin }} name: "Kotlin ${{ matrix.kotlin }} - Java ${{ matrix.java-version }}" From 953450f9e88b10c5a59427e673cb160f382a9ac1 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 15 Jun 2025 13:32:46 +0900 Subject: [PATCH 07/13] Update test-main.yml --- .github/workflows/test-main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-main.yml b/.github/workflows/test-main.yml index f3b99c99..9590d1c1 100644 --- a/.github/workflows/test-main.yml +++ b/.github/workflows/test-main.yml @@ -42,7 +42,7 @@ jobs: # LTS versions, latest version (if exists) java-version: [ '17', '21', '24' ] # Minimum version, latest release version, latest pre-release version (if exists) - kotlin: ['2.0.21', '2.1.20', '2.2.0-RC2'] + kotlin: ['2.0.21', '2.1.21', '2.2.0-RC2'] env: KOTLIN_VERSION: ${{ matrix.kotlin }} name: "Kotlin ${{ matrix.kotlin }} - Java ${{ matrix.java-version }}" From 1d3cf2a1b823ced513c391925b10a915d112c769 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 Jun 2025 10:44:15 +0000 Subject: [PATCH 08/13] Bump the dependencies group with 5 updates Bumps the dependencies group with 5 updates: | Package | From | To | | --- | --- | --- | | [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) | `2.19.0` | `2.19.1` | | [com.fasterxml.jackson.core:jackson-annotations](https://github.com/FasterXML/jackson) | `2.19.0` | `2.19.1` | | [com.fasterxml.jackson.dataformat:jackson-dataformat-xml](https://github.com/FasterXML/jackson-dataformat-xml) | `2.19.0` | `2.19.1` | | [com.fasterxml.jackson.dataformat:jackson-dataformat-csv](https://github.com/FasterXML/jackson-dataformats-text) | `2.19.0` | `2.19.1` | | com.fasterxml.jackson.datatype:jackson-datatype-jsr310 | `2.19.0` | `2.19.1` | Updates `com.fasterxml.jackson.core:jackson-databind` from 2.19.0 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-annotations` from 2.19.0 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.dataformat:jackson-dataformat-xml` from 2.19.0 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson-dataformat-xml/compare/jackson-dataformat-xml-2.19.0...jackson-dataformat-xml-2.19.1) Updates `com.fasterxml.jackson.dataformat:jackson-dataformat-csv` from 2.19.0 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson-dataformats-text/compare/jackson-dataformats-text-2.19.0...jackson-dataformats-text-2.19.1) Updates `com.fasterxml.jackson.datatype:jackson-datatype-jsr310` from 2.19.0 to 2.19.1 Updates `com.fasterxml.jackson.core:jackson-annotations` from 2.19.0 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.dataformat:jackson-dataformat-xml` from 2.19.0 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson-dataformat-xml/compare/jackson-dataformat-xml-2.19.0...jackson-dataformat-xml-2.19.1) Updates `com.fasterxml.jackson.dataformat:jackson-dataformat-csv` from 2.19.0 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson-dataformats-text/compare/jackson-dataformats-text-2.19.0...jackson-dataformats-text-2.19.1) Updates `com.fasterxml.jackson.datatype:jackson-datatype-jsr310` from 2.19.0 to 2.19.1 --- updated-dependencies: - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: com.fasterxml.jackson.core:jackson-annotations dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: com.fasterxml.jackson.dataformat:jackson-dataformat-xml dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: com.fasterxml.jackson.dataformat:jackson-dataformat-csv dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: com.fasterxml.jackson.datatype:jackson-datatype-jsr310 dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: com.fasterxml.jackson.core:jackson-annotations dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: com.fasterxml.jackson.dataformat:jackson-dataformat-xml dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: com.fasterxml.jackson.dataformat:jackson-dataformat-csv dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: com.fasterxml.jackson.datatype:jackson-datatype-jsr310 dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 614c698c..3d3b4af7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] kotlin = "2.0.21" # Mainly for CI, it can be rewritten by environment variable. -jackson = "2.19.0" +jackson = "2.19.1" # test libs junit = "5.13.1" From 890214d4b850b997181668ba6c614f475b17b7c3 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 22 Jun 2025 00:25:37 +0900 Subject: [PATCH 09/13] Porting test from https://github.com/FasterXML/jackson-module-kotlin/pull/978 --- .../kogera/zPorted/test/github/GitHub976.kt | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zPorted/test/github/GitHub976.kt diff --git a/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zPorted/test/github/GitHub976.kt b/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zPorted/test/github/GitHub976.kt new file mode 100644 index 00000000..c3077dab --- /dev/null +++ b/src/test/kotlin/io/github/projectmapk/jackson/module/kogera/zPorted/test/github/GitHub976.kt @@ -0,0 +1,21 @@ +package io.github.projectmapk.jackson.module.kogera.zPorted.test.github + +import com.fasterxml.jackson.databind.exc.InvalidNullException +import io.github.projectmapk.jackson.module.kogera.KotlinFeature +import io.github.projectmapk.jackson.module.kogera.jacksonObjectMapper +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertThrows + +class GitHub976 { + data class PrimitiveList(val list: List) + + @Test + fun strictNullChecks() { + val om = jacksonObjectMapper { + enable(KotlinFeature.StrictNullChecks) + } + assertThrows { + om.readValue("""{"list": [""] }""", PrimitiveList::class.java) + } + } +} From 10228431dc36c76b87bbfa8bddc2da8ceefebc69 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Jun 2025 10:40:57 +0000 Subject: [PATCH 10/13] Bump the dependencies group with 2 updates Bumps the dependencies group with 2 updates: [org.junit:junit-bom](https://github.com/junit-team/junit-framework) and [io.mockk:mockk](https://github.com/mockk/mockk). Updates `org.junit:junit-bom` from 5.13.1 to 5.13.2 - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/compare/r5.13.1...r5.13.2) Updates `io.mockk:mockk` from 1.14.2 to 1.14.4 - [Release notes](https://github.com/mockk/mockk/releases) - [Commits](https://github.com/mockk/mockk/compare/1.14.2...1.14.4) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-version: 5.13.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: io.mockk:mockk dependency-version: 1.14.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] --- gradle/libs.versions.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3d3b4af7..3aa8f54f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,7 +3,7 @@ kotlin = "2.0.21" # Mainly for CI, it can be rewritten by environment variable. jackson = "2.19.1" # test libs -junit = "5.13.1" +junit = "5.13.2" [libraries] kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib" } @@ -14,7 +14,7 @@ jackson-annotations = { module = "com.fasterxml.jackson.core:jackson-annotations # test libs kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect" } junit-bom = { module = "org.junit:junit-bom", version.ref = "junit" } -mockk = "io.mockk:mockk:1.14.2" +mockk = "io.mockk:mockk:1.14.4" jackson-xml = { module = "com.fasterxml.jackson.dataformat:jackson-dataformat-xml", version.ref = "jackson" } jackson-csv = { module = "com.fasterxml.jackson.dataformat:jackson-dataformat-csv", version.ref = "jackson" } jackson-jsr310 = { module = "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", version.ref = "jackson" } From ec592face1fb301b3b179497a52e638717abdf17 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sat, 5 Jul 2025 21:26:52 +0900 Subject: [PATCH 11/13] Modified to use more optimized concrete converter --- .../projectmapk/jackson/module/kogera/ser/Converters.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/io/github/projectmapk/jackson/module/kogera/ser/Converters.kt b/src/main/kotlin/io/github/projectmapk/jackson/module/kogera/ser/Converters.kt index caacdad3..5b1f44ef 100644 --- a/src/main/kotlin/io/github/projectmapk/jackson/module/kogera/ser/Converters.kt +++ b/src/main/kotlin/io/github/projectmapk/jackson/module/kogera/ser/Converters.kt @@ -3,10 +3,10 @@ package io.github.projectmapk.jackson.module.kogera.ser import com.fasterxml.jackson.databind.JavaType import com.fasterxml.jackson.databind.type.TypeFactory import com.fasterxml.jackson.databind.util.StdConverter -import io.github.projectmapk.jackson.module.kogera.GenericValueClassBoxConverter import io.github.projectmapk.jackson.module.kogera.JavaDuration import io.github.projectmapk.jackson.module.kogera.KOTLIN_DURATION_CLASS import io.github.projectmapk.jackson.module.kogera.KotlinDuration +import io.github.projectmapk.jackson.module.kogera.LongValueClassBoxConverter import kotlin.time.toJavaDuration internal class SequenceToIteratorConverter(private val input: JavaType) : StdConverter, Iterator<*>>() { @@ -21,7 +21,7 @@ internal class SequenceToIteratorConverter(private val input: JavaType) : StdCon } internal object KotlinDurationValueToJavaDurationConverter : StdConverter() { - private val boxConverter by lazy { GenericValueClassBoxConverter(Long::class.java, KOTLIN_DURATION_CLASS) } + private val boxConverter by lazy { LongValueClassBoxConverter(KOTLIN_DURATION_CLASS) } override fun convert(value: Long): JavaDuration = KotlinToJavaDurationConverter.convert(boxConverter.convert(value)) } From 8b177413e2c916a89bcb66f4b8a2a5d8658b75ec Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 6 Jul 2025 02:28:42 +0900 Subject: [PATCH 12/13] Update Kotlin versions on CI --- .github/workflows/test-main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-main.yml b/.github/workflows/test-main.yml index 9590d1c1..8e8cdfe1 100644 --- a/.github/workflows/test-main.yml +++ b/.github/workflows/test-main.yml @@ -42,7 +42,7 @@ jobs: # LTS versions, latest version (if exists) java-version: [ '17', '21', '24' ] # Minimum version, latest release version, latest pre-release version (if exists) - kotlin: ['2.0.21', '2.1.21', '2.2.0-RC2'] + kotlin: ['2.0.21', '2.1.21', '2.2.0'] env: KOTLIN_VERSION: ${{ matrix.kotlin }} name: "Kotlin ${{ matrix.kotlin }} - Java ${{ matrix.java-version }}" From b6322411fc9fa1b720bfc36732cdad8d1f7ebb78 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 6 Jul 2025 16:38:06 +0900 Subject: [PATCH 13/13] Change MethodType constants to lazy These are only used for processing related to value class, so they should be lazy to avoid unnecessary initial load. --- .../jackson/module/kogera/InternalCommons.kt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/kotlin/io/github/projectmapk/jackson/module/kogera/InternalCommons.kt b/src/main/kotlin/io/github/projectmapk/jackson/module/kogera/InternalCommons.kt index d77871e7..ab528715 100644 --- a/src/main/kotlin/io/github/projectmapk/jackson/module/kogera/InternalCommons.kt +++ b/src/main/kotlin/io/github/projectmapk/jackson/module/kogera/InternalCommons.kt @@ -71,15 +71,15 @@ internal val STRING_CLASS = String::class.java internal val JAVA_UUID_CLASS = java.util.UUID::class.java internal val ANY_CLASS = Any::class.java -internal val ANY_TO_ANY_METHOD_TYPE = MethodType.methodType(ANY_CLASS, ANY_CLASS) -internal val ANY_TO_INT_METHOD_TYPE = MethodType.methodType(INT_CLASS, ANY_CLASS) -internal val ANY_TO_LONG_METHOD_TYPE = MethodType.methodType(LONG_CLASS, ANY_CLASS) -internal val ANY_TO_STRING_METHOD_TYPE = MethodType.methodType(STRING_CLASS, ANY_CLASS) -internal val ANY_TO_JAVA_UUID_METHOD_TYPE = MethodType.methodType(JAVA_UUID_CLASS, ANY_CLASS) -internal val INT_TO_ANY_METHOD_TYPE = MethodType.methodType(ANY_CLASS, INT_CLASS) -internal val LONG_TO_ANY_METHOD_TYPE = MethodType.methodType(ANY_CLASS, LONG_CLASS) -internal val STRING_TO_ANY_METHOD_TYPE = MethodType.methodType(ANY_CLASS, STRING_CLASS) -internal val JAVA_UUID_TO_ANY_METHOD_TYPE = MethodType.methodType(ANY_CLASS, JAVA_UUID_CLASS) +internal val ANY_TO_ANY_METHOD_TYPE by lazy { MethodType.methodType(ANY_CLASS, ANY_CLASS) } +internal val ANY_TO_INT_METHOD_TYPE by lazy { MethodType.methodType(INT_CLASS, ANY_CLASS) } +internal val ANY_TO_LONG_METHOD_TYPE by lazy { MethodType.methodType(LONG_CLASS, ANY_CLASS) } +internal val ANY_TO_STRING_METHOD_TYPE by lazy { MethodType.methodType(STRING_CLASS, ANY_CLASS) } +internal val ANY_TO_JAVA_UUID_METHOD_TYPE by lazy { MethodType.methodType(JAVA_UUID_CLASS, ANY_CLASS) } +internal val INT_TO_ANY_METHOD_TYPE by lazy { MethodType.methodType(ANY_CLASS, INT_CLASS) } +internal val LONG_TO_ANY_METHOD_TYPE by lazy { MethodType.methodType(ANY_CLASS, LONG_CLASS) } +internal val STRING_TO_ANY_METHOD_TYPE by lazy { MethodType.methodType(ANY_CLASS, STRING_CLASS) } +internal val JAVA_UUID_TO_ANY_METHOD_TYPE by lazy { MethodType.methodType(ANY_CLASS, JAVA_UUID_CLASS) } internal fun unreflect(method: Method): MethodHandle = MethodHandles.lookup().unreflect(method) internal fun unreflectAsType(method: Method, type: MethodType): MethodHandle = unreflect(method).asType(type)