From 5d33a01bdb774f328e8164ecffab75b6a137b84b Mon Sep 17 00:00:00 2001 From: Patrick Gruntz Date: Tue, 22 Apr 2025 18:33:33 +0200 Subject: [PATCH 1/5] Bump kotlin to 2.1.10 and some other versions --- build.gradle | 8 +- crystal-map-api/build.gradle | 2 +- crystal-map-couchbase-connector/build.gradle | 6 +- .../src/main/AndroidManifest.xml | 3 +- crystal-map-processor/build.gradle | 7 +- .../model/field/CblBaseFieldHolder.kt | 2 +- .../model/typeconverter/TypeConverterUtils.kt | 2 +- .../util/JavaAnnotationUtil.java | 9 +- .../schwarz/CoachBaseBinderProcessorTest.java | 198 +++++++++--------- .../CouchbaseBaseBinderProcessorKotlinTest.kt | 2 + .../src/test/java/com/schwarz/LoggerTest.java | 22 +- .../UnsupportedOperationExceptionTest.java | 89 ++++---- demo/build.gradle | 6 +- .../com/demo/entity/ProductEntityTest.kt | 4 +- dummy/build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 16 files changed, 184 insertions(+), 180 deletions(-) diff --git a/build.gradle b/build.gradle index 120a4420..961f9247 100755 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.9.21' + ext.kotlin_version = '2.1.20' ext.groupName = 'com.github.SchwarzIT' repositories { google() @@ -11,9 +11,9 @@ buildscript { } } dependencies { - classpath("com.android.library:com.android.library.gradle.plugin:8.1.4") - classpath("com.android.application:com.android.application.gradle.plugin:8.1.4") - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.21" + classpath("com.android.library:com.android.library.gradle.plugin:8.4.0") + classpath("com.android.application:com.android.application.gradle.plugin:8.4.0") + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:2.1.20" classpath "org.jlleitschuh.gradle:ktlint-gradle:11.5.1" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/crystal-map-api/build.gradle b/crystal-map-api/build.gradle index 1b0dff43..771d9fe2 100644 --- a/crystal-map-api/build.gradle +++ b/crystal-map-api/build.gradle @@ -4,7 +4,7 @@ apply plugin: 'java' dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - testImplementation 'junit:junit:4.12' + testImplementation 'junit:junit:4.13.2' implementation "commons-codec:commons-codec:1.15" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" } diff --git a/crystal-map-couchbase-connector/build.gradle b/crystal-map-couchbase-connector/build.gradle index 27cf058f..5b555c90 100644 --- a/crystal-map-couchbase-connector/build.gradle +++ b/crystal-map-couchbase-connector/build.gradle @@ -46,9 +46,9 @@ afterEvaluate { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test.ext:junit:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.2.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1' compileOnly 'com.couchbase.lite:couchbase-lite-android:2.1.2' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation project(path: ':crystal-map-api') diff --git a/crystal-map-couchbase-connector/src/main/AndroidManifest.xml b/crystal-map-couchbase-connector/src/main/AndroidManifest.xml index 22a51829..c4e6c98d 100644 --- a/crystal-map-couchbase-connector/src/main/AndroidManifest.xml +++ b/crystal-map-couchbase-connector/src/main/AndroidManifest.xml @@ -1,2 +1 @@ - + diff --git a/crystal-map-processor/build.gradle b/crystal-map-processor/build.gradle index 5d8483fc..37d7e19a 100644 --- a/crystal-map-processor/build.gradle +++ b/crystal-map-processor/build.gradle @@ -13,11 +13,12 @@ dependencies { implementation 'org.apache.commons:commons-lang3:3.4' implementation "com.fasterxml.jackson.module:jackson-module-kotlin:2.13.3" implementation 'com.j2html:j2html:1.4.0' + implementation "org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.9.0" testImplementation 'com.google.testing.compile:compile-testing:0.21.0' - testImplementation 'junit:junit:4.12' - testImplementation 'dev.zacsweers.kctfork:core:0.4.0' + testImplementation 'junit:junit:4.13.2' + testImplementation 'dev.zacsweers.kctfork:core:0.7.0' testImplementation 'org.mockito:mockito-core:1.10.19' - testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0' + testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0' implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" kapt "com.google.auto.service:auto-service:1.1.1" compileOnly "com.google.auto.service:auto-service:1.1.1" diff --git a/crystal-map-processor/src/main/java/com/schwarz/crystalprocessor/model/field/CblBaseFieldHolder.kt b/crystal-map-processor/src/main/java/com/schwarz/crystalprocessor/model/field/CblBaseFieldHolder.kt index 9419b938..91a63909 100644 --- a/crystal-map-processor/src/main/java/com/schwarz/crystalprocessor/model/field/CblBaseFieldHolder.kt +++ b/crystal-map-processor/src/main/java/com/schwarz/crystalprocessor/model/field/CblBaseFieldHolder.kt @@ -31,7 +31,7 @@ abstract class CblBaseFieldHolder(val dbField: String, private val mField: Field get() = mField.readonly val constantName: String - get() = ConversionUtil.convertCamelToUnderscore(dbField).toUpperCase() + get() = ConversionUtil.convertCamelToUnderscore(dbField).uppercase() val defaultValue: String get() = mField.defaultValue diff --git a/crystal-map-processor/src/main/java/com/schwarz/crystalprocessor/model/typeconverter/TypeConverterUtils.kt b/crystal-map-processor/src/main/java/com/schwarz/crystalprocessor/model/typeconverter/TypeConverterUtils.kt index e6dcaaa7..429c90fd 100644 --- a/crystal-map-processor/src/main/java/com/schwarz/crystalprocessor/model/typeconverter/TypeConverterUtils.kt +++ b/crystal-map-processor/src/main/java/com/schwarz/crystalprocessor/model/typeconverter/TypeConverterUtils.kt @@ -17,4 +17,4 @@ fun Element.getTypeConverterInterface(): KmType? { private val typeConverterKmClass = ITypeConverter::class.java.getAnnotation(Metadata::class.java).toKmClass() private fun Metadata.toKmClass() = - (KotlinClassMetadata.read(this) as KotlinClassMetadata.Class).kmClass + (KotlinClassMetadata.readStrict(this) as KotlinClassMetadata.Class).kmClass diff --git a/crystal-map-processor/src/main/java/com/schwarz/crystalprocessor/util/JavaAnnotationUtil.java b/crystal-map-processor/src/main/java/com/schwarz/crystalprocessor/util/JavaAnnotationUtil.java index 385eaf07..062cf54b 100644 --- a/crystal-map-processor/src/main/java/com/schwarz/crystalprocessor/util/JavaAnnotationUtil.java +++ b/crystal-map-processor/src/main/java/com/schwarz/crystalprocessor/util/JavaAnnotationUtil.java @@ -6,10 +6,9 @@ public class JavaAnnotationUtil { - public static Entity createReadOnlyCopyOfEntityAnnotation(final Entity source) - { - Entity annotation = new Entity() - { + public static Entity createReadOnlyCopyOfEntityAnnotation(final Entity source) { + + return new Entity() { @Override public Class annotationType() { @@ -36,8 +35,6 @@ public String database() { return source.database(); } }; - - return annotation; } } diff --git a/crystal-map-processor/src/test/java/com/schwarz/CoachBaseBinderProcessorTest.java b/crystal-map-processor/src/test/java/com/schwarz/CoachBaseBinderProcessorTest.java index d87303cf..b4073271 100644 --- a/crystal-map-processor/src/test/java/com/schwarz/CoachBaseBinderProcessorTest.java +++ b/crystal-map-processor/src/test/java/com/schwarz/CoachBaseBinderProcessorTest.java @@ -23,123 +23,127 @@ public void testSuccessProcessing() { Compilation compilation = javac() .withProcessors(new CoachBaseBinderProcessor()) - .compile(JavaFileObjects.forSourceString("com.kaufland.testModels.ListTest", "package com.kaufland.testModels;\n" + - "\n" + - "import java.util.ArrayList;\n" + - "import com.schwarz.crystalapi.Entity;\n" + - "import com.schwarz.crystalapi.Field;\n" + - "import com.schwarz.crystalapi.Fields;\n" + - "import java.io.InputStream;\n" + - "\n" + - "@Entity(\n" + - " database = \"mydb_db\"\n" + - ")\n" + - "@Fields({@Field(\n" + - " defaultValue = \"product\",\n" + - " type = String.class,\n" + - " name = \"type\",\n" + - " readonly = true\n" + - "), @Field(\n" + - " type = String.class,\n" + - " name = \"name\"\n" + - "), @Field(\n" + - " list = true,\n" + - " type = String.class,\n" + - " name = \"comments\"\n" + - ")" + - ", @Field(\n"+ - " type = Boolean.class,\n" + - " name = \"bool\"\n" + - " )" + - ", @Field(\n" + - " list = true,\n" + - " type = String.class,\n" + - " name = \"identifiers\"\n" + - ")})" + - "public class ListTest {\n" + - "}")); + .compile(JavaFileObjects.forSourceString("com.kaufland.testModels.ListTest", """ + package com.kaufland.testModels; + + import java.util.ArrayList; + import com.schwarz.crystalapi.Entity; + import com.schwarz.crystalapi.Field; + import com.schwarz.crystalapi.Fields; + import java.io.InputStream; + + @Entity( + database = "mydb_db" + ) + @Fields({@Field( + defaultValue = "product", + type = String.class, + name = "type", + readonly = true + ), @Field( + type = String.class, + name = "name" + ), @Field( + list = true, + type = String.class, + name = "comments" + )\ + , @Field( + type = Boolean.class, + name = "bool" + )\ + , @Field( + list = true, + type = String.class, + name = "identifiers" + )})\ + public class ListTest { + }""")); if(compilation.status() == Compilation.Status.FAILURE){ Diagnostic diagnostic = compilation.diagnostics().get(0); Assert.fail(diagnostic.getMessage(Locale.GERMAN)); return; } - Assert.assertEquals(compilation.status(), Compilation.Status.SUCCESS); + Assert.assertEquals(Compilation.Status.SUCCESS, compilation.status()); } @Test public void testSuccessSubEntityProcessing() { - JavaFileObject mMainEntity = JavaFileObjects.forSourceString("com.kaufland.testModels.ListTest", "package com.kaufland.testModels;\n" + - "\n" + - "import java.util.ArrayList;\n" + - "import com.schwarz.crystalapi.Entity;\n" + - "import com.schwarz.crystalapi.Field;\n" + - "import com.schwarz.crystalapi.Fields;\n" + - "import java.io.InputStream;\n" + - "\n" + - "@Entity\n" + - "@Fields({@Field(\n" + - " type = com.kaufland.testModels.Sub.class,\n" + - " name = \"list_sub\",\n" + - " list = true\n" + - "), @Field(\n" + - " type = Sub.class,\n" + - " name = \"sub\"\n" + - ")})" + - "public class ListTest {\n" + - "}"); - JavaFileObject subEntity = JavaFileObjects.forSourceString("com.kaufland.testModels.Sub", "package com.kaufland.testModels;\n" + - "\n" + - "import com.schwarz.crystalapi.MapWrapper;\n" + - "import com.schwarz.crystalapi.Field;\n" + - "import com.schwarz.crystalapi.Fields;\n" + - "\n" + - "/**\n" + - " * Created by sbra0902 on 31.05.17.\n" + - " */\n" + - "@MapWrapper\n" + - "@Fields({@Field(\n" + - " type = String.class,\n" + - " name = \"test\"\n" + - ")})" + - "public class Sub {\n" + - "}"); + JavaFileObject mMainEntity = JavaFileObjects.forSourceString("com.kaufland.testModels.ListTest", """ + package com.kaufland.testModels; + + import java.util.ArrayList; + import com.schwarz.crystalapi.Entity; + import com.schwarz.crystalapi.Field; + import com.schwarz.crystalapi.Fields; + import java.io.InputStream; + + @Entity + @Fields({@Field( + type = com.kaufland.testModels.Sub.class, + name = "list_sub", + list = true + ), @Field( + type = Sub.class, + name = "sub" + )})\ + public class ListTest { + }"""); + JavaFileObject subEntity = JavaFileObjects.forSourceString("com.kaufland.testModels.Sub", """ + package com.kaufland.testModels; + + import com.schwarz.crystalapi.MapWrapper; + import com.schwarz.crystalapi.Field; + import com.schwarz.crystalapi.Fields; + + /** + * Created by sbra0902 on 31.05.17. + */ + @MapWrapper + @Fields({@Field( + type = String.class, + name = "test" + )})\ + public class Sub { + }"""); Compilation compilation = javac() .withProcessors(new CoachBaseBinderProcessor()) .compile(mMainEntity, subEntity); - Assert.assertEquals(compilation.status(), Compilation.Status.SUCCESS); + Assert.assertEquals(Compilation.Status.SUCCESS, compilation.status()); } @Test public void testFailContructorAndPublicFieldProcessing() { - JavaFileObject subEntity = JavaFileObjects.forSourceString("com.kaufland.testModels.Sub", "package com.kaufland.testModels;\n" + - "\n" + - "import com.schwarz.crystalapi.Entity;\n" + - "import com.schwarz.crystalapi.Field;\n" + - "import com.schwarz.crystalapi.Fields;\n" + - "\n" + - "/**\n" + - " * Created by sbra0902 on 31.05.17.\n" + - " */\n" + - "@Entity\n" + - "@Fields({@Field(\n" + - " type = String.class,\n" + - " name = \"test\"\n" + - "), @Field(\n" + - " type = String.class,\n" + - " name = \"type\",\n" + - " defaultValue = \"product\",\n"+ - " readonly= true\n"+ - ")})" + - "public class Sub {\n" + - "\n" + - " public Sub(String test){\n" + - " }\n" + - "}"); + JavaFileObject subEntity = JavaFileObjects.forSourceString("com.kaufland.testModels.Sub", """ + package com.kaufland.testModels; + + import com.schwarz.crystalapi.Entity; + import com.schwarz.crystalapi.Field; + import com.schwarz.crystalapi.Fields; + + /** + * Created by sbra0902 on 31.05.17. + */ + @Entity + @Fields({@Field( + type = String.class, + name = "test" + ), @Field( + type = String.class, + name = "type", + defaultValue = "product", + readonly= true + )})\ + public class Sub { + + public Sub(String test){ + } + }"""); Compilation compilation = @@ -148,7 +152,7 @@ public void testFailContructorAndPublicFieldProcessing() { .compile(subEntity); - Assert.assertEquals(compilation.status(), Compilation.Status.FAILURE); + Assert.assertEquals(Compilation.Status.FAILURE, compilation.status()); Assert.assertTrue(compilation.diagnostics().stream().anyMatch(diagnostic -> diagnostic.getMessage(Locale.GERMAN).equals("Entity should not have a constructor"))); } diff --git a/crystal-map-processor/src/test/java/com/schwarz/CouchbaseBaseBinderProcessorKotlinTest.kt b/crystal-map-processor/src/test/java/com/schwarz/CouchbaseBaseBinderProcessorKotlinTest.kt index c21a060c..efba57e6 100644 --- a/crystal-map-processor/src/test/java/com/schwarz/CouchbaseBaseBinderProcessorKotlinTest.kt +++ b/crystal-map-processor/src/test/java/com/schwarz/CouchbaseBaseBinderProcessorKotlinTest.kt @@ -479,6 +479,8 @@ class CouchbaseBaseBinderProcessorKotlinTest { return KotlinCompilation().apply { sources = sourceFiles.toList() + useKapt4 = true + // pass your own instance of an annotation processor annotationProcessors = listOf(CoachBaseBinderProcessor()) correctErrorTypes = true diff --git a/crystal-map-processor/src/test/java/com/schwarz/LoggerTest.java b/crystal-map-processor/src/test/java/com/schwarz/LoggerTest.java index 34cbb1a6..5edac59c 100644 --- a/crystal-map-processor/src/test/java/com/schwarz/LoggerTest.java +++ b/crystal-map-processor/src/test/java/com/schwarz/LoggerTest.java @@ -27,38 +27,38 @@ public void init() { @Test public void testWarn() { - new Logger(mMock).warn("message", null); - Mockito.verify(mMessagerMock).printMessage(Diagnostic.Kind.WARNING, "message", null); + new Logger(mMock).warn("warnMessage", null); + Mockito.verify(mMessagerMock).printMessage(Diagnostic.Kind.WARNING, "warnMessage", null); } @Test public void testError() { - new Logger(mMock).error("message", null); - Mockito.verify(mMessagerMock).printMessage(Diagnostic.Kind.ERROR, "message", null); + new Logger(mMock).error("errorMessage", null); + Mockito.verify(mMessagerMock).printMessage(Diagnostic.Kind.ERROR, "errorMessage", null); } @Test public void testErrorAbort() { try { - new Logger(mMock).abortWithError("message", null, null); + new Logger(mMock).abortWithError("abortMessage", null, null); Assert.fail("Should throw Exception"); - } catch (RuntimeException e) { + } catch (RuntimeException ignored) { } - Mockito.verify(mMessagerMock).printMessage(Diagnostic.Kind.ERROR, "message", null); + Mockito.verify(mMessagerMock).printMessage(Diagnostic.Kind.ERROR, "abortMessage", null); } @Test public void testInfo() { - new Logger(mMock).info("message"); - Mockito.verify(mMessagerMock).printMessage(Diagnostic.Kind.NOTE, "message"); + new Logger(mMock).info("infoMessage"); + Mockito.verify(mMessagerMock).printMessage(Diagnostic.Kind.NOTE, "infoMessage"); - new Logger(mMock).info("message", null); - Mockito.verify(mMessagerMock).printMessage(Diagnostic.Kind.NOTE, "message", null); + new Logger(mMock).info("infoMessageWithNull", null); + Mockito.verify(mMessagerMock).printMessage(Diagnostic.Kind.NOTE, "infoMessageWithNull", null); } } diff --git a/crystal-map-processor/src/test/java/com/schwarz/generation/UnsupportedOperationExceptionTest.java b/crystal-map-processor/src/test/java/com/schwarz/generation/UnsupportedOperationExceptionTest.java index 05aab4af..5b66b9b0 100644 --- a/crystal-map-processor/src/test/java/com/schwarz/generation/UnsupportedOperationExceptionTest.java +++ b/crystal-map-processor/src/test/java/com/schwarz/generation/UnsupportedOperationExceptionTest.java @@ -19,50 +19,51 @@ public void testInUse() { Compilation compilation = javac() .withProcessors(new CoachBaseBinderProcessor()) - .compile(JavaFileObjects.forSourceString("com.kaufland.testModels.UnsupportedOperationExceptionTest", "package com.kaufland.testModels;\n" + - "\n" + - "import java.util.ArrayList;\n" + - "import com.schwarz.crystalapi.Entity;\n" + - "import com.schwarz.crystalapi.Field;\n" + - "import com.schwarz.crystalapi.Fields;\n" + - "import com.schwarz.crystalapi.MapWrapper;\n" + - "import com.schwarz.crystalapi.deprecated.Deprecated;\n" + - "import com.schwarz.crystalapi.deprecated.DeprecatedField;\n" + - "import java.io.InputStream;\n" + - "\n" + - "@Entity(type = Entity.Type.READONLY, database = \"hydra_db\")\n" + - "@MapWrapper" + - "@Fields({@Field(\n" + - " name = \"type\",\n" + - " type = String.class,\n" + - " defaultValue = \"Article\",\n" + - " readonly = true),\n" + - " @Field(\n" + - " name = \"bottle\",\n" + - " type = String.class,\n" + - " list = true),\n" + - " @Field(\n" + - " name = \"bottle_box\",\n" + - " type = String.class,\n" + - " readonly = false),\n" + - " @Field(\n" + - " name = \"bottle2\",\n" + - " type = String.class),\n" + - " @Field(\n" + - " name = \"bottle_box2\",\n" + - " type = String.class,\n" + - " list = true)\n" + - "})\n" + - "@Deprecated(fields = {@DeprecatedField(\n" + - " field = \"bottle\",\n" + - " replacedBy = \"bottle2\",\n" + - " inUse = true), @DeprecatedField(\n" + - " field = \"bottle_box\",\n" + - " replacedBy = \"bottle_box2\",\n" + - " inUse = true)\n" + - "})\n" + - "public class UnsupportedOperationExceptionTest {\n" + - "}")); + .compile(JavaFileObjects.forSourceString("com.kaufland.testModels.UnsupportedOperationExceptionTest", """ + package com.kaufland.testModels; + + import java.util.ArrayList; + import com.schwarz.crystalapi.Entity; + import com.schwarz.crystalapi.Field; + import com.schwarz.crystalapi.Fields; + import com.schwarz.crystalapi.MapWrapper; + import com.schwarz.crystalapi.deprecated.Deprecated; + import com.schwarz.crystalapi.deprecated.DeprecatedField; + import java.io.InputStream; + + @Entity(type = Entity.Type.READONLY, database = "hydra_db") + @MapWrapper\ + @Fields({@Field( + name = "type", + type = String.class, + defaultValue = "Article", + readonly = true), + @Field( + name = "bottle", + type = String.class, + list = true), + @Field( + name = "bottle_box", + type = String.class, + readonly = false), + @Field( + name = "bottle2", + type = String.class), + @Field( + name = "bottle_box2", + type = String.class, + list = true) + }) + @Deprecated(fields = {@DeprecatedField( + field = "bottle", + replacedBy = "bottle2", + inUse = true), @DeprecatedField( + field = "bottle_box", + replacedBy = "bottle_box2", + inUse = true) + }) + public class UnsupportedOperationExceptionTest { + }""")); if (compilation.status() == Compilation.Status.FAILURE){ Diagnostic diagnostic = compilation.diagnostics().get(0); diff --git a/demo/build.gradle b/demo/build.gradle index cc7b965e..ca238269 100644 --- a/demo/build.gradle +++ b/demo/build.gradle @@ -1,13 +1,13 @@ buildscript { - ext.kotlin_version = '1.9.21' + ext.kotlin_version = '2.1.20' repositories { google() mavenCentral() } dependencies { - classpath("com.android.library:com.android.library.gradle.plugin:8.1.4") - classpath("com.android.application:com.android.application.gradle.plugin:8.1.4") + classpath("com.android.library:com.android.library.gradle.plugin:8.2.0") + classpath("com.android.application:com.android.application.gradle.plugin:8.2.0") classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" //TODO enable to locally test plugin diff --git a/demo/src/test/java/kaufland/com/demo/entity/ProductEntityTest.kt b/demo/src/test/java/kaufland/com/demo/entity/ProductEntityTest.kt index 81d61a10..77f53cd7 100644 --- a/demo/src/test/java/kaufland/com/demo/entity/ProductEntityTest.kt +++ b/demo/src/test/java/kaufland/com/demo/entity/ProductEntityTest.kt @@ -459,7 +459,7 @@ class ProductEntityTest { } @Test - fun `creating and reading 1000 docs with 1000 positions should take less than 600ms`() { + fun `creating and reading 1000 docs with 1000 positions should take less than 700ms`() { val positions = List(1000) { mutableMapOf("comment" to "$it") } val someDates = List(1000) { LocalDate.now().toString() } val maps = List(1000) { @@ -475,6 +475,6 @@ class ProductEntityTest { entities.flatMap { it.someDates ?: emptyList() } } - assertTrue("Expecting time for creating and reading to be < 600ms but was $duration", duration < 600) + assertTrue("Expecting time for creating and reading to be < 700ms but was $duration", duration < 700) } } diff --git a/dummy/build.gradle b/dummy/build.gradle index 526d3c44..acca6dec 100644 --- a/dummy/build.gradle +++ b/dummy/build.gradle @@ -1,6 +1,6 @@ buildscript { - ext.kotlin_version = '1.9.21' + ext.kotlin_version = '2.1.20' repositories { google() mavenCentral() diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 5d5bd995..dd47d428 100755 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,5 +3,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip networkTimeout=300000 From 7db4b74128a1011fdd56c33caa89c00464befae8 Mon Sep 17 00:00:00 2001 From: Patrick Gruntz Date: Wed, 23 Apr 2025 15:08:04 +0200 Subject: [PATCH 2/5] Bump versions of some libraries --- crystal-map-couchbase-connector/build.gradle | 2 +- crystal-map-processor/build.gradle | 19 +++++++------------ .../crystalprocessor/meta/SchemaGenerator.kt | 12 +++++++++++- crystal-map-versioning-plugin/build.gradle | 2 +- .../SchemaValidationLoggerImpl.kt | 2 +- .../VersioningPlugin.kt | 4 ++-- .../VersioningPluginExtension.kt | 2 +- .../task/ValidationTask.kt | 18 ++++++++++++++---- .../com/demo/entity/ProductEntityTest.kt | 4 ++-- 9 files changed, 40 insertions(+), 25 deletions(-) diff --git a/crystal-map-couchbase-connector/build.gradle b/crystal-map-couchbase-connector/build.gradle index 5b555c90..0df8e029 100644 --- a/crystal-map-couchbase-connector/build.gradle +++ b/crystal-map-couchbase-connector/build.gradle @@ -50,6 +50,6 @@ dependencies { androidTestImplementation 'androidx.test.ext:junit:1.2.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1' compileOnly 'com.couchbase.lite:couchbase-lite-android:2.1.2' - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation project(path: ':crystal-map-api') } diff --git a/crystal-map-processor/build.gradle b/crystal-map-processor/build.gradle index 37d7e19a..864d3475 100644 --- a/crystal-map-processor/build.gradle +++ b/crystal-map-processor/build.gradle @@ -10,14 +10,14 @@ dependencies { implementation 'com.squareup:kotlinpoet:1.15.0' implementation 'com.squareup:kotlinpoet-metadata:1.15.0' implementation project(path: ':crystal-map-api', configuration: 'default') - implementation 'org.apache.commons:commons-lang3:3.4' - implementation "com.fasterxml.jackson.module:jackson-module-kotlin:2.13.3" - implementation 'com.j2html:j2html:1.4.0' + implementation 'org.apache.commons:commons-lang3:3.17.0' + implementation "com.fasterxml.jackson.module:jackson-module-kotlin:2.18.3" + implementation 'com.j2html:j2html:1.6.0' implementation "org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.9.0" testImplementation 'com.google.testing.compile:compile-testing:0.21.0' testImplementation 'junit:junit:4.13.2' testImplementation 'dev.zacsweers.kctfork:core:0.7.0' - testImplementation 'org.mockito:mockito-core:1.10.19' + testImplementation 'org.mockito:mockito-core:5.17.0' testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0' implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" kapt "com.google.auto.service:auto-service:1.1.1" @@ -62,7 +62,7 @@ publishing { } jacoco { - toolVersion = "0.8.7" + toolVersion = "0.8.13" } jacocoTestReport { @@ -70,13 +70,8 @@ jacocoTestReport { dependsOn 'test' reports { - - xml{ - enabled true - } - html{ - enabled false - } + xml.required = true + html.required = false } } diff --git a/crystal-map-processor/src/main/java/com/schwarz/crystalprocessor/meta/SchemaGenerator.kt b/crystal-map-processor/src/main/java/com/schwarz/crystalprocessor/meta/SchemaGenerator.kt index 39ae697f..632b62f8 100644 --- a/crystal-map-processor/src/main/java/com/schwarz/crystalprocessor/meta/SchemaGenerator.kt +++ b/crystal-map-processor/src/main/java/com/schwarz/crystalprocessor/meta/SchemaGenerator.kt @@ -1,6 +1,7 @@ package com.schwarz.crystalprocessor.meta import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.module.kotlin.KotlinFeature import com.fasterxml.jackson.module.kotlin.KotlinModule import com.schwarz.crystalapi.deprecated.DeprecationType import com.schwarz.crystalprocessor.model.deprecated.DeprecatedModel @@ -18,7 +19,16 @@ class SchemaGenerator(path: String, val fileName: String) { fun generate() { path.mkdirs() - val mapper = ObjectMapper().registerModule(KotlinModule()) + val mapper = ObjectMapper().registerModule( + KotlinModule.Builder() + .withReflectionCacheSize(512) + .configure(KotlinFeature.NullToEmptyCollection, false) + .configure(KotlinFeature.NullToEmptyMap, false) + .configure(KotlinFeature.NullIsSameAsDefault, false) + .configure(KotlinFeature.SingletonSupport, false) + .configure(KotlinFeature.StrictNullChecks, false) + .build() + ) File(path, fileName).writeText(mapper.writeValueAsString(jsonEntitySegments.values)) } diff --git a/crystal-map-versioning-plugin/build.gradle b/crystal-map-versioning-plugin/build.gradle index 2f38f424..67994749 100644 --- a/crystal-map-versioning-plugin/build.gradle +++ b/crystal-map-versioning-plugin/build.gradle @@ -38,5 +38,5 @@ dependencies { implementation(gradleApi()) implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation project(path: ':crystal-map-api', configuration: 'default') - implementation "com.fasterxml.jackson.module:jackson-module-kotlin:2.13.3" + implementation "com.fasterxml.jackson.module:jackson-module-kotlin:2.18.3" } \ No newline at end of file diff --git a/crystal-map-versioning-plugin/src/main/java/com/schwarz/crystalversioningplugin/SchemaValidationLoggerImpl.kt b/crystal-map-versioning-plugin/src/main/java/com/schwarz/crystalversioningplugin/SchemaValidationLoggerImpl.kt index 10102355..1a38ea73 100644 --- a/crystal-map-versioning-plugin/src/main/java/com/schwarz/crystalversioningplugin/SchemaValidationLoggerImpl.kt +++ b/crystal-map-versioning-plugin/src/main/java/com/schwarz/crystalversioningplugin/SchemaValidationLoggerImpl.kt @@ -1,4 +1,4 @@ -package kaufland.com.couchbaseentityversioningplugin +package com.schwarz.crystalversioningplugin import com.schwarz.crystalapi.schema.EntitySchema import com.schwarz.crystalapi.schema.SchemaValidationLogger diff --git a/crystal-map-versioning-plugin/src/main/java/com/schwarz/crystalversioningplugin/VersioningPlugin.kt b/crystal-map-versioning-plugin/src/main/java/com/schwarz/crystalversioningplugin/VersioningPlugin.kt index 34fc20af..20138d01 100644 --- a/crystal-map-versioning-plugin/src/main/java/com/schwarz/crystalversioningplugin/VersioningPlugin.kt +++ b/crystal-map-versioning-plugin/src/main/java/com/schwarz/crystalversioningplugin/VersioningPlugin.kt @@ -1,6 +1,6 @@ -package kaufland.com.couchbaseentityversioningplugin +package com.schwarz.crystalversioningplugin -import kaufland.com.couchbaseentityversioningplugin.task.ValidationTask +import com.schwarz.crystalversioningplugin.task.ValidationTask import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.Task diff --git a/crystal-map-versioning-plugin/src/main/java/com/schwarz/crystalversioningplugin/VersioningPluginExtension.kt b/crystal-map-versioning-plugin/src/main/java/com/schwarz/crystalversioningplugin/VersioningPluginExtension.kt index b2459d80..29fefb1e 100644 --- a/crystal-map-versioning-plugin/src/main/java/com/schwarz/crystalversioningplugin/VersioningPluginExtension.kt +++ b/crystal-map-versioning-plugin/src/main/java/com/schwarz/crystalversioningplugin/VersioningPluginExtension.kt @@ -1,4 +1,4 @@ -package kaufland.com.couchbaseentityversioningplugin +package com.schwarz.crystalversioningplugin import com.schwarz.crystalapi.schema.SchemaValidator diff --git a/crystal-map-versioning-plugin/src/main/java/com/schwarz/crystalversioningplugin/task/ValidationTask.kt b/crystal-map-versioning-plugin/src/main/java/com/schwarz/crystalversioningplugin/task/ValidationTask.kt index 285bfbd6..4b869e1a 100644 --- a/crystal-map-versioning-plugin/src/main/java/com/schwarz/crystalversioningplugin/task/ValidationTask.kt +++ b/crystal-map-versioning-plugin/src/main/java/com/schwarz/crystalversioningplugin/task/ValidationTask.kt @@ -1,12 +1,13 @@ -package kaufland.com.couchbaseentityversioningplugin.task +package com.schwarz.crystalversioningplugin.task import com.fasterxml.jackson.core.type.TypeReference import com.fasterxml.jackson.databind.DeserializationFeature import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.module.kotlin.KotlinFeature import com.fasterxml.jackson.module.kotlin.KotlinModule import com.schwarz.crystalapi.schema.EntitySchema -import kaufland.com.couchbaseentityversioningplugin.SchemaValidationLoggerImpl -import kaufland.com.couchbaseentityversioningplugin.VersioningPluginExtension +import com.schwarz.crystalversioningplugin.SchemaValidationLoggerImpl +import com.schwarz.crystalversioningplugin.VersioningPluginExtension import org.gradle.api.DefaultTask import org.gradle.api.tasks.Input import org.gradle.api.tasks.TaskAction @@ -44,7 +45,16 @@ open class ValidationTask : DefaultTask() { } private fun parseVersionSchema(file: File): List { - val mapper = ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false).registerModule(KotlinModule()) + val mapper = ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false).registerModule( + KotlinModule.Builder() + .withReflectionCacheSize(512) + .configure(KotlinFeature.NullToEmptyCollection, false) + .configure(KotlinFeature.NullToEmptyMap, false) + .configure(KotlinFeature.NullIsSameAsDefault, false) + .configure(KotlinFeature.SingletonSupport, false) + .configure(KotlinFeature.StrictNullChecks, false) + .build() + ) return mapper.readValue(file, object : TypeReference>() {}) } } diff --git a/demo/src/test/java/kaufland/com/demo/entity/ProductEntityTest.kt b/demo/src/test/java/kaufland/com/demo/entity/ProductEntityTest.kt index 77f53cd7..81d61a10 100644 --- a/demo/src/test/java/kaufland/com/demo/entity/ProductEntityTest.kt +++ b/demo/src/test/java/kaufland/com/demo/entity/ProductEntityTest.kt @@ -459,7 +459,7 @@ class ProductEntityTest { } @Test - fun `creating and reading 1000 docs with 1000 positions should take less than 700ms`() { + fun `creating and reading 1000 docs with 1000 positions should take less than 600ms`() { val positions = List(1000) { mutableMapOf("comment" to "$it") } val someDates = List(1000) { LocalDate.now().toString() } val maps = List(1000) { @@ -475,6 +475,6 @@ class ProductEntityTest { entities.flatMap { it.someDates ?: emptyList() } } - assertTrue("Expecting time for creating and reading to be < 700ms but was $duration", duration < 700) + assertTrue("Expecting time for creating and reading to be < 600ms but was $duration", duration < 600) } } From b7d051a7376a2923ccbf081af20846b5dfe2553a Mon Sep 17 00:00:00 2001 From: Patrick Gruntz Date: Wed, 23 Apr 2025 15:40:31 +0200 Subject: [PATCH 3/5] Update dependencies in 'demo' and upgrade github workflow --- .github/workflows/android_pre_hook.yml | 4 ++-- demo/build.gradle | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/android_pre_hook.yml b/.github/workflows/android_pre_hook.yml index 60d9fd09..eacadd8c 100644 --- a/.github/workflows/android_pre_hook.yml +++ b/.github/workflows/android_pre_hook.yml @@ -14,10 +14,10 @@ jobs: steps: - uses: actions/checkout@v2 - name: set up JDK 17 - uses: actions/setup-java@v2 + uses: actions/setup-java@v3 with: java-version: '17' - distribution: 'adopt' + distribution: 'temurin' cache: gradle - name: Grant execute permission for gradlew diff --git a/demo/build.gradle b/demo/build.gradle index ca238269..69e3ff71 100644 --- a/demo/build.gradle +++ b/demo/build.gradle @@ -88,7 +88,7 @@ kapt { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation project(path: ':crystal-map-api') implementation project(path: ':crystal-map-couchbase-connector') @@ -100,9 +100,9 @@ dependencies { // Test dependencies testImplementation 'junit:junit:4.13.2' - testImplementation 'org.mockito:mockito-core:3.10.0' - implementation group: 'ch.qos.logback', name: 'logback-core', version: '1.4.4' - implementation group: 'org.slf4j', name: 'slf4j-api', version: '2.0.1' - testImplementation 'ch.qos.logback:logback-classic:1.4.4' - kapt 'org.apache.logging.log4j:log4j-api:2.19.0' + testImplementation 'org.mockito:mockito-core:5.17.0' + implementation group: 'ch.qos.logback', name: 'logback-core', version: '1.5.18' + implementation group: 'org.slf4j', name: 'slf4j-api', version: '2.0.17' + testImplementation 'ch.qos.logback:logback-classic:1.5.18' + kapt 'org.apache.logging.log4j:log4j-api:2.24.3' } From 489ae9f4d712eca8a79f75cc2ab178c31ba8f292 Mon Sep 17 00:00:00 2001 From: Patrick Gruntz Date: Thu, 24 Apr 2025 12:49:03 +0200 Subject: [PATCH 4/5] Fixed small renaming in build-file --- crystal-map-versioning-plugin/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crystal-map-versioning-plugin/build.gradle b/crystal-map-versioning-plugin/build.gradle index 67994749..ed821217 100644 --- a/crystal-map-versioning-plugin/build.gradle +++ b/crystal-map-versioning-plugin/build.gradle @@ -9,7 +9,7 @@ gradlePlugin { plugins { andcouchbaseentityversioning { id = 'andcouchbase-entity-versioning-plugin' - implementationClass = 'kaufland.com.couchbaseentityversioningplugin.VersioningPlugin' + implementationClass = 'com.schwarz.crystalversioningplugin.VersioningPlugin' } } } From 58866c9dfca7f6025ad5ec473b7db3ae136749d7 Mon Sep 17 00:00:00 2001 From: Patrick Gruntz Date: Thu, 22 May 2025 19:29:30 +0200 Subject: [PATCH 5/5] Update android gradle plugin and kotlinx-coroutines --- build.gradle | 4 ++-- crystal-map-processor/build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 961f9247..067f5de4 100755 --- a/build.gradle +++ b/build.gradle @@ -11,8 +11,8 @@ buildscript { } } dependencies { - classpath("com.android.library:com.android.library.gradle.plugin:8.4.0") - classpath("com.android.application:com.android.application.gradle.plugin:8.4.0") + classpath("com.android.library:com.android.library.gradle.plugin:8.9.1") + classpath("com.android.application:com.android.application.gradle.plugin:8.9.1") classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:2.1.20" classpath "org.jlleitschuh.gradle:ktlint-gradle:11.5.1" // NOTE: Do not place your application dependencies here; they belong diff --git a/crystal-map-processor/build.gradle b/crystal-map-processor/build.gradle index 864d3475..91fa5a91 100644 --- a/crystal-map-processor/build.gradle +++ b/crystal-map-processor/build.gradle @@ -18,7 +18,7 @@ dependencies { testImplementation 'junit:junit:4.13.2' testImplementation 'dev.zacsweers.kctfork:core:0.7.0' testImplementation 'org.mockito:mockito-core:5.17.0' - testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0' + testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2' implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" kapt "com.google.auto.service:auto-service:1.1.1" compileOnly "com.google.auto.service:auto-service:1.1.1" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index dd47d428..1279e4b0 100755 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,5 +3,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip networkTimeout=300000