diff --git a/CHANGELOG.md b/CHANGELOG.md index 0639556..5870e90 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ ## 0.4.0 +**ALL PROJECT HAS MIGRATED FROM PACKAGE `com.insanusmokrassar` TO `dev.inmo`** + +* `Kotlin`: `1.3.72` -> `1.4.10` +* `Serialization`: `0.20.0` -> `1.0.1` + + ## 0.3.1 * `Kotlin`: `1.3.71` -> `1.3.72` diff --git a/build.gradle b/build.gradle index 8987619..48d1c16 100644 --- a/build.gradle +++ b/build.gradle @@ -37,7 +37,7 @@ kotlin { dependencies { implementation kotlin('stdlib') api kotlin('reflect') - api "org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:$kotlin_serialisation_runtime_version" + api "org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlin_serialisation_runtime_version" } } commonTest { @@ -46,11 +46,6 @@ kotlin { implementation kotlin('test-annotations-common') } } - jvmMain { - dependencies { - api "org.jetbrains.kotlinx:kotlinx-serialization-runtime:$kotlin_serialisation_runtime_version" - } - } jvmTest { dependencies { implementation kotlin('test-junit') diff --git a/gradle.properties b/gradle.properties index 68f1140..38473de 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ kotlin.code.style=official -kotlin_version=1.3.72 -kotlin_serialisation_runtime_version=0.20.0 +kotlin_version=1.4.10 +kotlin_serialisation_runtime_version=1.0.1 gradle_bintray_plugin_version=1.8.5 github_release_plugin_version=2.2.12 diff --git a/src/commonMain/kotlin/com/insanusmokrassar/sdi/Module.kt b/src/commonMain/kotlin/com/insanusmokrassar/sdi/Module.kt deleted file mode 100644 index ea376e6..0000000 --- a/src/commonMain/kotlin/com/insanusmokrassar/sdi/Module.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.insanusmokrassar.sdi - -import kotlinx.serialization.ContextualSerialization - -class Module internal constructor(base: Map) : Map by base \ No newline at end of file diff --git a/src/commonMain/kotlin/com/insanusmokrassar/sdi/HelperTools.kt b/src/commonMain/kotlin/dev/inmo/sdi/HelperTools.kt similarity index 79% rename from src/commonMain/kotlin/com/insanusmokrassar/sdi/HelperTools.kt rename to src/commonMain/kotlin/dev/inmo/sdi/HelperTools.kt index 19aae93..43a227f 100644 --- a/src/commonMain/kotlin/com/insanusmokrassar/sdi/HelperTools.kt +++ b/src/commonMain/kotlin/dev/inmo/sdi/HelperTools.kt @@ -1,6 +1,5 @@ -package com.insanusmokrassar.sdi +package dev.inmo.sdi -import kotlinx.serialization.ImplicitReflectionSerializer import kotlinx.serialization.json.Json import kotlinx.serialization.modules.SerializersModuleBuilder import kotlin.reflect.KClass @@ -8,15 +7,13 @@ import kotlin.reflect.KClass internal val nonStrictJson = Json { isLenient = true ignoreUnknownKeys = true - serializeSpecialFloatingPointValues = true } -@ImplicitReflectionSerializer fun Json.loadModule( json: String, vararg additionalClassesToInclude: KClass<*>, moduleBuilder: (SerializersModuleBuilder.() -> Unit)? = null -): Module = parse( +): Module = decodeFromString( if (moduleBuilder != null) { ModuleDeserializerStrategy(moduleBuilder, *additionalClassesToInclude) } else { @@ -25,7 +22,6 @@ fun Json.loadModule( json ) -@ImplicitReflectionSerializer fun loadModule( json: String, vararg additionalClassesToInclude: KClass<*>, diff --git a/src/commonMain/kotlin/dev/inmo/sdi/Module.kt b/src/commonMain/kotlin/dev/inmo/sdi/Module.kt new file mode 100644 index 0000000..121aad1 --- /dev/null +++ b/src/commonMain/kotlin/dev/inmo/sdi/Module.kt @@ -0,0 +1,5 @@ +package dev.inmo.sdi + +import kotlinx.serialization.Contextual + +class Module internal constructor(base: Map) : Map by base \ No newline at end of file diff --git a/src/commonMain/kotlin/com/insanusmokrassar/sdi/ModuleDeserializerStrategy.kt b/src/commonMain/kotlin/dev/inmo/sdi/ModuleDeserializerStrategy.kt similarity index 69% rename from src/commonMain/kotlin/com/insanusmokrassar/sdi/ModuleDeserializerStrategy.kt rename to src/commonMain/kotlin/dev/inmo/sdi/ModuleDeserializerStrategy.kt index da0db8e..893a333 100644 --- a/src/commonMain/kotlin/com/insanusmokrassar/sdi/ModuleDeserializerStrategy.kt +++ b/src/commonMain/kotlin/dev/inmo/sdi/ModuleDeserializerStrategy.kt @@ -1,36 +1,36 @@ -package com.insanusmokrassar.sdi +package dev.inmo.sdi -import com.insanusmokrassar.sdi.utils.createModuleBasedOnConfigRoot +import dev.inmo.sdi.utils.createModuleBasedOnConfigRoot import kotlinx.serialization.* import kotlinx.serialization.builtins.MapSerializer import kotlinx.serialization.builtins.serializer +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.json.* import kotlinx.serialization.modules.SerializersModuleBuilder import kotlin.reflect.KClass -@ImplicitReflectionSerializer internal class ModuleDeserializerStrategy( private val moduleBuilder: (SerializersModuleBuilder.() -> Unit)? = null, private vararg val additionalClassesToInclude: KClass<*> ) : DeserializationStrategy { - private val internalSerializer = MapSerializer(String.serializer(), ContextSerializer(Any::class)) + private val internalSerializer = MapSerializer(String.serializer(), ContextualSerializer(Any::class)) override val descriptor: SerialDescriptor get() = internalSerializer.descriptor + @InternalSerializationApi override fun deserialize(decoder: Decoder): Module { - val json = JsonObjectSerializer.deserialize(decoder) + val json = JsonObject.serializer().deserialize(decoder) val jsonSerialFormat = createModuleBasedOnConfigRoot( json, moduleBuilder, - decoder.context, + decoder.serializersModule, *additionalClassesToInclude ) val resultJson = JsonObject( json.keys.associateWith { JsonPrimitive(it) } ) - val map = jsonSerialFormat.fromJson(internalSerializer, resultJson) + val map = jsonSerialFormat.decodeFromJsonElement(internalSerializer, resultJson) return Module(map) } - - override fun patch(decoder: Decoder, old: Module): Module = throw UpdateNotSupportedException("Module") } diff --git a/src/commonMain/kotlin/com/insanusmokrassar/sdi/utils/DependencyResolver.kt b/src/commonMain/kotlin/dev/inmo/sdi/utils/DependencyResolver.kt similarity index 76% rename from src/commonMain/kotlin/com/insanusmokrassar/sdi/utils/DependencyResolver.kt rename to src/commonMain/kotlin/dev/inmo/sdi/utils/DependencyResolver.kt index 8c0eaa0..50bda14 100644 --- a/src/commonMain/kotlin/com/insanusmokrassar/sdi/utils/DependencyResolver.kt +++ b/src/commonMain/kotlin/dev/inmo/sdi/utils/DependencyResolver.kt @@ -1,25 +1,25 @@ -package com.insanusmokrassar.sdi.utils +package dev.inmo.sdi.utils import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder import kotlinx.serialization.json.* import kotlinx.serialization.modules.SerializersModuleBuilder import kotlin.reflect.KClass internal object AlreadyRegisteredException : Exception() -@ImplicitReflectionSerializer internal class DependencyResolver( serialModuleBuilder: SerializersModuleBuilder, kClass: KClass, private val formatterGetter: () -> Json, private val dependencyGetter: (String) -> Any ) : KSerializer { - private val originalSerializer: KSerializer = try { - kClass.serializer() - } catch (e: Exception) { - ContextSerializer(kClass) - } + @InternalSerializationApi + private val originalSerializer: KSerializer = kClass.serializerOrNull() ?: ContextualSerializer(kClass) private val objectsCache = mutableMapOf() + @InternalSerializationApi override val descriptor: SerialDescriptor = originalSerializer.descriptor init { @@ -39,8 +39,9 @@ internal class DependencyResolver( } } + @InternalSerializationApi override fun deserialize(decoder: Decoder): T { - val decoded = decoder.decodeSerializableValue(JsonElementSerializer) + val decoded = decoder.decodeSerializableValue(JsonElement.serializer()) return when { decoded is JsonPrimitive && decoded.contentOrNull != null -> decoded.content.let { dependencyName -> @Suppress("UNCHECKED_CAST") @@ -49,14 +50,15 @@ internal class DependencyResolver( } } decoded is JsonArray -> { - val serializer = resolveSerializerByPackageName(decoded.getPrimitive(0).content) + val serializer = resolveSerializerByPackageName(decoded[0].jsonPrimitive.content) @Suppress("UNCHECKED_CAST") - formatterGetter().fromJson(serializer, decoded[1]) as T + formatterGetter().decodeFromJsonElement(serializer, decoded[1]) as T } - else -> formatterGetter().fromJson(originalSerializer, decoded) + else -> formatterGetter().decodeFromJsonElement(originalSerializer, decoded) } } + @InternalSerializationApi override fun serialize(encoder: Encoder, value: T) { objectsCache.keys.firstOrNull { objectsCache[it] === value diff --git a/src/commonMain/kotlin/com/insanusmokrassar/sdi/utils/JsonAdaptations.kt b/src/commonMain/kotlin/dev/inmo/sdi/utils/JsonAdaptations.kt similarity index 86% rename from src/commonMain/kotlin/com/insanusmokrassar/sdi/utils/JsonAdaptations.kt rename to src/commonMain/kotlin/dev/inmo/sdi/utils/JsonAdaptations.kt index 2771ce5..a76b783 100644 --- a/src/commonMain/kotlin/com/insanusmokrassar/sdi/utils/JsonAdaptations.kt +++ b/src/commonMain/kotlin/dev/inmo/sdi/utils/JsonAdaptations.kt @@ -1,6 +1,5 @@ -package com.insanusmokrassar.sdi.utils +package dev.inmo.sdi.utils -import kotlinx.serialization.ImplicitReflectionSerializer import kotlinx.serialization.InternalSerializationApi import kotlinx.serialization.json.* import kotlinx.serialization.modules.* @@ -18,15 +17,15 @@ private fun JsonElement.resolvePackageName(currentKey: String, otherDependencies } } ?: throw IllegalArgumentException("Value on dependency name \"$currentKey\" is invalid: provided $this, but expected package name or other dependency name string") is JsonObject -> return currentKey to null - is JsonArray -> return getPrimitive(0).contentOrNull ?.let { it to null } ?: throw IllegalArgumentException("Value on first argument of dependency value must be its package as a string, but was provided ${get(0)}") + is JsonArray -> return get(0).jsonPrimitive.contentOrNull ?.let { it to null } ?: throw IllegalArgumentException("Value on first argument of dependency value must be its package as a string, but was provided ${get(0)}") } } -@ImplicitReflectionSerializer +@InternalSerializationApi internal fun createModuleBasedOnConfigRoot( jsonObject: JsonObject, moduleBuilder: (SerializersModuleBuilder.() -> Unit)? = null, - baseContext: SerialModule, + baseContext: SerializersModule, vararg additionalClassesToInclude: KClass<*> ): Json { lateinit var caches: Map Any> @@ -53,7 +52,7 @@ internal fun createModuleBasedOnConfigRoot( } is JsonArray -> { if (elemValue.size > 1) { - elemValue.getObject(1) + elemValue[1].jsonObject } else { JsonObject(emptyMap()) } @@ -61,7 +60,7 @@ internal fun createModuleBasedOnConfigRoot( } val serializer = resolveSerializerByPackageName(packageName) - return@callback jsonStringFormat.fromJson(serializer, argumentsObject) as Any + return@callback jsonStringFormat.decodeFromJsonElement(serializer, argumentsObject) as Any } }.toMap() @@ -105,10 +104,10 @@ internal fun createModuleBasedOnConfigRoot( } } ) - return Json( - configuration = JsonConfiguration(useArrayPolymorphism = true), - context = context - ).also { + return Json { + useArrayPolymorphism = true + serializersModule = context + }.also { jsonStringFormat = it } } diff --git a/src/commonMain/kotlin/com/insanusmokrassar/sdi/utils/OptionalContextualIncluding.kt b/src/commonMain/kotlin/dev/inmo/sdi/utils/OptionalContextualIncluding.kt similarity index 70% rename from src/commonMain/kotlin/com/insanusmokrassar/sdi/utils/OptionalContextualIncluding.kt rename to src/commonMain/kotlin/dev/inmo/sdi/utils/OptionalContextualIncluding.kt index 085aa46..e6e315e 100644 --- a/src/commonMain/kotlin/com/insanusmokrassar/sdi/utils/OptionalContextualIncluding.kt +++ b/src/commonMain/kotlin/dev/inmo/sdi/utils/OptionalContextualIncluding.kt @@ -1,7 +1,6 @@ -package com.insanusmokrassar.sdi.utils +package dev.inmo.sdi.utils -import kotlinx.serialization.InternalSerializationApi -import kotlinx.serialization.KSerializer +import kotlinx.serialization.* import kotlinx.serialization.modules.* import kotlin.reflect.KClass @@ -11,7 +10,7 @@ fun SerializersModuleBuilder.optionalContextual( ) = try { contextual(kClass, kSerializer) true -} catch (e: SerializerAlreadyRegisteredException) { +} catch (e: SerializationException) { false } diff --git a/src/commonMain/kotlin/com/insanusmokrassar/sdi/utils/TypesHelper.kt b/src/commonMain/kotlin/dev/inmo/sdi/utils/TypesHelper.kt similarity index 83% rename from src/commonMain/kotlin/com/insanusmokrassar/sdi/utils/TypesHelper.kt rename to src/commonMain/kotlin/dev/inmo/sdi/utils/TypesHelper.kt index c869c5d..06210f0 100644 --- a/src/commonMain/kotlin/com/insanusmokrassar/sdi/utils/TypesHelper.kt +++ b/src/commonMain/kotlin/dev/inmo/sdi/utils/TypesHelper.kt @@ -1,18 +1,21 @@ -package com.insanusmokrassar.sdi.utils +package dev.inmo.sdi.utils import kotlinx.serialization.* import kotlin.reflect.KClass +import kotlin.reflect.KType internal expect fun resolveKClassByPackageName(packageName: String): KClass<*> -@ImplicitReflectionSerializer +@InternalSerializationApi internal fun resolveSerializerByKClass(kClass: KClass): KSerializer = kClass.serializer() -@ImplicitReflectionSerializer +@InternalSerializationApi internal fun resolveSerializerByPackageName(packageName: String): KSerializer<*> = resolveSerializerByKClass( resolveKClassByPackageName(packageName) ) +internal expect val KClass.supertypes: List + internal val KClass<*>.allSubclasses: Set> get() { val subclasses = mutableSetOf>() diff --git a/src/commonTest/kotlin/com/insanusmokrassar/sdi/ListTest.kt b/src/commonTest/kotlin/dev/inmo/sdi/ListTest.kt similarity index 90% rename from src/commonTest/kotlin/com/insanusmokrassar/sdi/ListTest.kt rename to src/commonTest/kotlin/dev/inmo/sdi/ListTest.kt index 669f8dd..784a43e 100644 --- a/src/commonTest/kotlin/com/insanusmokrassar/sdi/ListTest.kt +++ b/src/commonTest/kotlin/dev/inmo/sdi/ListTest.kt @@ -1,4 +1,4 @@ -package com.insanusmokrassar.sdi +package dev.inmo.sdi import kotlinx.serialization.* import kotlin.test.Test @@ -12,11 +12,10 @@ interface List_ChildAPI { } @Serializable -class List_Parent(override val services: List<@ContextualSerialization List_ChildAPI>) : List_ParentalAPI +class List_Parent(override val services: List<@Contextual List_ChildAPI>) : List_ParentalAPI @Serializable class List_Child(override val names: List) : List_ChildAPI -@ImplicitReflectionSerializer class ListTest { val servicesNum = 10 diff --git a/src/commonTest/kotlin/com/insanusmokrassar/sdi/SimpleCustomObjectTest.kt b/src/commonTest/kotlin/dev/inmo/sdi/SimpleCustomObjectTest.kt similarity index 86% rename from src/commonTest/kotlin/com/insanusmokrassar/sdi/SimpleCustomObjectTest.kt rename to src/commonTest/kotlin/dev/inmo/sdi/SimpleCustomObjectTest.kt index 579ba31..172d24c 100644 --- a/src/commonTest/kotlin/com/insanusmokrassar/sdi/SimpleCustomObjectTest.kt +++ b/src/commonTest/kotlin/dev/inmo/sdi/SimpleCustomObjectTest.kt @@ -1,4 +1,4 @@ -package com.insanusmokrassar.sdi +package dev.inmo.sdi import kotlinx.serialization.* import kotlin.test.Test @@ -12,28 +12,32 @@ interface SimpleCustomObject_ServiceAPI { } @Serializable -class SimpleCustomObject_Controller(@ContextualSerialization val service: SimpleCustomObject_ServiceAPI) : SimpleCustomObject_ControllerAPI { +class SimpleCustomObject_Controller(@Contextual val service: SimpleCustomObject_ServiceAPI) : + SimpleCustomObject_ControllerAPI { override fun showUp() { println("Inited with name \"${service.names}\"") } } @Serializable -class SimpleCustomObject_CustomController1(@ContextualSerialization val service: SimpleCustomObject_ServiceAPI) : SimpleCustomObject_ControllerAPI { +class SimpleCustomObject_CustomController1(@Contextual val service: SimpleCustomObject_ServiceAPI) : + SimpleCustomObject_ControllerAPI { override fun showUp() { println("Inited with name \"${service.names}\"") } } @Serializable -class SimpleCustomObject_CustomController2(@ContextualSerialization val service: SimpleCustomObject_BusinessService) : SimpleCustomObject_ControllerAPI { +class SimpleCustomObject_CustomController2(@Contextual val service: SimpleCustomObject_BusinessService) : + SimpleCustomObject_ControllerAPI { override fun showUp() { println("Inited with name \"${service.names}\"") } } @Serializable -class SimpleCustomObject_CustomController3(@ContextualSerialization val service: SimpleCustomObject_ServiceAPI) : SimpleCustomObject_ControllerAPI { +class SimpleCustomObject_CustomController3(@Contextual val service: SimpleCustomObject_ServiceAPI) : + SimpleCustomObject_ControllerAPI { override fun showUp() { println("Inited with name \"${service.names}\"") } @@ -43,7 +47,6 @@ class SimpleCustomObject_BusinessService(override val names: List) : Sim @Serializable class SimpleCustomObject_BusinessService1(override val names: List) : SimpleCustomObject_ServiceAPI -@ImplicitReflectionSerializer class SimpleCustomObjectTest { @Test fun test_that_simple_config_correctly_work() { diff --git a/src/commonTest/kotlin/com/insanusmokrassar/sdi/SimpleTest.kt b/src/commonTest/kotlin/dev/inmo/sdi/SimpleTest.kt similarity index 88% rename from src/commonTest/kotlin/com/insanusmokrassar/sdi/SimpleTest.kt rename to src/commonTest/kotlin/dev/inmo/sdi/SimpleTest.kt index c528c5b..abacfe2 100644 --- a/src/commonTest/kotlin/com/insanusmokrassar/sdi/SimpleTest.kt +++ b/src/commonTest/kotlin/dev/inmo/sdi/SimpleTest.kt @@ -1,4 +1,4 @@ -package com.insanusmokrassar.sdi +package dev.inmo.sdi import kotlinx.serialization.* import kotlin.test.Test @@ -12,7 +12,7 @@ interface Simple_ServiceAPI { } @Serializable -class Simple_Controller(@ContextualSerialization val service: Simple_ServiceAPI) : Simple_ControllerAPI { +class Simple_Controller(@Contextual val service: Simple_ServiceAPI) : Simple_ControllerAPI { override fun showUp() { println("Inited with name \"${service.names}\"") } @@ -20,7 +20,6 @@ class Simple_Controller(@ContextualSerialization val service: Simple_ServiceAPI) @Serializable class Simple_BusinessService(override val names: List) : Simple_ServiceAPI -@ImplicitReflectionSerializer class SimpleTest { @Test fun test_that_simple_config_correctly_work() { diff --git a/src/jvmMain/kotlin/com/insanusmokrassar/sdi/utils/resolveKClassByPackageName.kt b/src/jvmMain/kotlin/com/insanusmokrassar/sdi/utils/resolveKClassByPackageName.kt deleted file mode 100644 index 0405c8e..0000000 --- a/src/jvmMain/kotlin/com/insanusmokrassar/sdi/utils/resolveKClassByPackageName.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.insanusmokrassar.sdi.utils - -import kotlin.reflect.KClass - -actual fun resolveKClassByPackageName(packageName: String): KClass<*> = Class.forName(packageName).kotlin diff --git a/src/jvmMain/kotlin/com/insanusmokrassar/sdi/JVMHelperTools.kt b/src/jvmMain/kotlin/dev/inmo/sdi/JVMHelperTools.kt similarity index 84% rename from src/jvmMain/kotlin/com/insanusmokrassar/sdi/JVMHelperTools.kt rename to src/jvmMain/kotlin/dev/inmo/sdi/JVMHelperTools.kt index 538aed2..8220793 100644 --- a/src/jvmMain/kotlin/com/insanusmokrassar/sdi/JVMHelperTools.kt +++ b/src/jvmMain/kotlin/dev/inmo/sdi/JVMHelperTools.kt @@ -1,34 +1,33 @@ -package com.insanusmokrassar.sdi +package dev.inmo.sdi import kotlin.reflect.KClass -import kotlinx.serialization.ImplicitReflectionSerializer import kotlinx.serialization.json.Json import kotlinx.serialization.modules.SerializersModuleBuilder import java.io.File import java.io.InputStream -@ImplicitReflectionSerializer + fun Json.loadModule( stream: InputStream, vararg additionalClassesToInclude: KClass<*>, moduleBuilder: (SerializersModuleBuilder.() -> Unit)? = null ) = loadModule(stream.reader().readText(), *additionalClassesToInclude, moduleBuilder = moduleBuilder) -@ImplicitReflectionSerializer + fun loadModule( stream: InputStream, vararg additionalClassesToInclude: KClass<*>, moduleBuilder: (SerializersModuleBuilder.() -> Unit)? = null ) = nonStrictJson.loadModule(stream, *additionalClassesToInclude, moduleBuilder = moduleBuilder) -@ImplicitReflectionSerializer + fun Json.loadModule( file: File, vararg additionalClassesToInclude: KClass<*>, moduleBuilder: (SerializersModuleBuilder.() -> Unit)? = null ) = loadModule(file.inputStream(), *additionalClassesToInclude, moduleBuilder = moduleBuilder) -@ImplicitReflectionSerializer + fun loadModule( file: File, vararg additionalClassesToInclude: KClass<*>, diff --git a/src/jvmMain/kotlin/dev/inmo/sdi/utils/resolveKClassByPackageName.kt b/src/jvmMain/kotlin/dev/inmo/sdi/utils/resolveKClassByPackageName.kt new file mode 100644 index 0000000..a8965c0 --- /dev/null +++ b/src/jvmMain/kotlin/dev/inmo/sdi/utils/resolveKClassByPackageName.kt @@ -0,0 +1,8 @@ +package dev.inmo.sdi.utils + +import kotlin.reflect.KClass +import kotlin.reflect.KType + +actual fun resolveKClassByPackageName(packageName: String): KClass<*> = Class.forName(packageName).kotlin +internal actual val KClass.supertypes: List + get() = supertypes \ No newline at end of file