Compare commits

...

38 Commits

Author SHA1 Message Date
bdcc179b7b protecteds in map repos instead of privates 2021-09-09 12:16:12 +06:00
55ffd4b46f start 0.5.26 2021-09-09 12:07:56 +06:00
7fc5ee70e1 Merge pull request #92 from InsanusMokrassar/0.5.25
0.5.25
2021-09-08 12:27:31 +06:00
a24a335743 TypedSerializer#plusAssign and TypedSerializer#minusAssign 2021-09-08 12:18:42 +06:00
ef9af71960 clamp deprecation and Iterable#diff 2021-09-08 12:10:32 +06:00
925702d315 MPPFile#withoutSlashAtTheEnd 2021-09-08 12:06:23 +06:00
d50dffec8c update dependencies 2021-09-08 12:01:02 +06:00
cef2081a13 start 0.5.25 2021-09-08 11:57:55 +06:00
06c8bde7c9 Merge pull request #91 from InsanusMokrassar/0.5.24
0.5.24
2021-09-04 14:59:13 +06:00
c9bbfa3820 update gradle config and fix build 2021-09-04 14:58:15 +06:00
eed7cfdc42 CoroutineScope with safely handler parameter 2021-09-04 14:46:12 +06:00
bd9b0d16ab update dependencies 2021-09-04 14:34:27 +06:00
ea6c33b497 start 0.5.24 2021-09-04 14:20:35 +06:00
dc80ade2fb Merge pull request #90 from InsanusMokrassar/0.5.23
0.5.23
2021-09-02 14:35:31 +06:00
f6a06ee8ea small addition to joinTo 2021-09-02 14:33:35 +06:00
2644f27975 small addition to joinTo 2021-09-02 14:16:02 +06:00
3dc68a7b8b small addition to joinTo 2021-09-02 14:09:34 +06:00
97fc1d6239 small addition to joinTo 2021-09-02 14:01:01 +06:00
662f4d22a3 fill changelog 2021-09-02 13:52:00 +06:00
b70aa12be9 add joinTo 2021-09-02 13:50:40 +06:00
71f12f5f19 Update exposed 2021-09-02 10:09:45 +06:00
e10504eeeb Update CHANGELOG.md 2021-09-02 10:09:06 +06:00
2dea9f3bc0 start 0.5.23 2021-09-02 10:08:28 +06:00
35c9dda5bc Merge pull request #89 from InsanusMokrassar/0.5.22
0.5.22 - Update ktor
2021-08-27 08:57:57 +06:00
e831f3949a Update CHANGELOG.md 2021-08-26 14:30:37 +06:00
b0b39cc693 Update gradle.properties 2021-08-26 14:28:21 +06:00
fc03be3f73 Merge pull request #88 from InsanusMokrassar/0.5.22
0.5.22
2021-08-25 16:35:02 +06:00
b61f6b81f1 update dependencies 2021-08-25 15:50:10 +06:00
f5bc1c1fce start 0.5.22 2021-08-25 15:10:55 +06:00
a729f9568c Merge pull request #87 from InsanusMokrassar/0.5.21
0.5.21
2021-08-17 11:01:03 +06:00
5749e00377 update klock 2021-08-17 10:36:15 +06:00
ef73c24a0c fixes in TypedSerializer 2021-08-17 10:35:45 +06:00
94717ee351 start 0.5.21 2021-08-17 10:30:50 +06:00
9a18ded65b Merge pull request #86 from InsanusMokrassar/0.5.20
0.5.20
2021-08-16 19:14:56 +06:00
b23220f491 cursor get float and cursor get*OrNull 2021-08-16 18:42:08 +06:00
6e6bb03246 start 0.5.20 2021-08-16 18:35:46 +06:00
1ae6bae3b8 Merge pull request #85 from InsanusMokrassar/0.5.19
0.5.19#2
2021-08-09 11:24:06 +06:00
57b7797ea4 Merge pull request #84 from InsanusMokrassar/0.5.19
0.5.19
2021-08-08 22:52:09 +06:00
14 changed files with 227 additions and 41 deletions

View File

@@ -1,5 +1,61 @@
# Changelog
## 0.5.26
* `Repos`:
* `InMemory`:
* `MapCRUDRepo`s and `MapKeyValueRepo`s got `protected` methods and properties instead of private
## 0.5.25
* `Versions`:
* `UUID`: `0.3.0` -> `0.3.1`
* `Common`:
* New property `MPPFile#withoutSlashAtTheEnd`
* Extension `clamp` has been deprecated
* New extension `Iterable#diff`
* `Serialization`:
* New operators `TypedSerializer#plusAssign` and `TypedSerializer#minusAssign`
## 0.5.24
* `Versions`:
* `Coroutines`: `1.5.1` -> `1.5.2`
* `Klock`: `2.3.4` -> `2.4.1`
* `Coroutines`:
* New function `CoroutineScope` with safely exceptions handler as second parameter
## 0.5.23
* `Versions`:
* `Exposed`: `0.33.1` -> `0.34.1`
* `Common`:
* New extensions `Iterable#joinTo` and `Array#joinTo`
## 0.5.22
* `Versions`
* `Kotlin`: `1.5.21` -> `1.5.30`
* `Klock`: `2.3.2` -> `2.3.4`
* `AppCompat`: `1.3.0` -> `1.3.1`
* `Ktor`: `1.6.2` -> `1.6.3`
## 0.5.21
* `Versions`
* `Klock`: `2.3.1` -> `2.3.2`
* `Serialization`
* `Typed Serializer`:
* `TypedSerializer` Descriptor serial name has been fixed
## 0.5.20
* `Repos`:
* `Common`
* `Android`:
* `*OrNull` analogs of `Cursor.get*(String)` extensions have been added
* Extensions `Cursor.getFloat` and `Cursor.getFloatOrNull` have been added
## 0.5.19
* `LanguageCode`:

View File

@@ -12,9 +12,7 @@ package dev.inmo.micro_utils.common
AnnotationTarget.PROPERTY_GETTER,
AnnotationTarget.PROPERTY_SETTER,
AnnotationTarget.FUNCTION,
AnnotationTarget.TYPE,
AnnotationTarget.TYPEALIAS,
AnnotationTarget.TYPE_PARAMETER
AnnotationTarget.TYPEALIAS
)
annotation class PreviewFeature(val message: String = "It is possible, that behaviour of this thing will be changed or removed in future releases")
@@ -30,8 +28,6 @@ annotation class PreviewFeature(val message: String = "It is possible, that beha
AnnotationTarget.PROPERTY_GETTER,
AnnotationTarget.PROPERTY_SETTER,
AnnotationTarget.FUNCTION,
AnnotationTarget.TYPE,
AnnotationTarget.TYPEALIAS,
AnnotationTarget.TYPE_PARAMETER
AnnotationTarget.TYPEALIAS
)
annotation class Warning(val message: String)

View File

@@ -1,10 +1,5 @@
package dev.inmo.micro_utils.common
@Deprecated("Redundant", ReplaceWith("coerceIn(min, max)"))
@Suppress("NOTHING_TO_INLINE")
inline fun <T : Comparable<T>> T.clamp(min: T, max: T): T {
return when {
this < min -> min
this > max -> max
else -> this
}
}
inline fun <T : Comparable<T>> T.clamp(min: T, max: T): T = coerceIn(min, max)

View File

@@ -2,6 +2,8 @@
package dev.inmo.micro_utils.common
import kotlin.jvm.JvmInline
private inline fun <T> getObject(
additional: MutableList<T>,
iterator: Iterator<T>
@@ -27,8 +29,8 @@ data class Diff<T> internal constructor(
private inline fun <T> performChanges(
potentialChanges: MutableList<Pair<IndexedValue<T>?, IndexedValue<T>?>>,
additionalsInOld: MutableList<T>,
additionalsInNew: MutableList<T>,
additionsInOld: MutableList<T>,
additionsInNew: MutableList<T>,
changedList: MutableList<Pair<IndexedValue<T>, IndexedValue<T>>>,
removedList: MutableList<IndexedValue<T>>,
addedList: MutableList<IndexedValue<T>>,
@@ -52,20 +54,20 @@ private inline fun <T> performChanges(
newPotentials.first().second ?.let { addedList.add(it) }
newPotentials.drop(1).take(newPotentials.size - 2).forEach { (oldOne, newOne) ->
addedList.add(newOne!!)
oldOne ?.let { additionalsInOld.add(oldOne.value) }
oldOne ?.let { additionsInOld.add(oldOne.value) }
}
if (newPotentials.size > 1) {
newPotentials.last().first ?.value ?.let { additionalsInOld.add(it) }
newPotentials.last().first ?.value ?.let { additionsInOld.add(it) }
}
}
newOneEqualToOldObject -> {
newPotentials.first().first ?.let { removedList.add(it) }
newPotentials.drop(1).take(newPotentials.size - 2).forEach { (oldOne, newOne) ->
removedList.add(oldOne!!)
newOne ?.let { additionalsInNew.add(newOne.value) }
newOne ?.let { additionsInNew.add(newOne.value) }
}
if (newPotentials.size > 1) {
newPotentials.last().second ?.value ?.let { additionalsInNew.add(it) }
newPotentials.last().second ?.value ?.let { additionsInNew.add(it) }
}
}
}
@@ -139,6 +141,10 @@ fun <T> Iterable<T>.calculateDiff(
return Diff(removedObjects.toList(), changedObjects.toList(), addedObjects.toList())
}
inline fun <T> Iterable<T>.diff(
other: Iterable<T>,
strictComparison: Boolean = false
): Diff<T> = calculateDiff(other, strictComparison)
inline fun <T> Diff(old: Iterable<T>, new: Iterable<T>) = old.calculateDiff(new)
inline fun <T> StrictDiff(old: Iterable<T>, new: Iterable<T>) = old.calculateDiff(new, true)

View File

@@ -0,0 +1,59 @@
package dev.inmo.micro_utils.common
inline fun <I, R> Iterable<I>.joinTo(
crossinline separatorFun: (I) -> R?,
prefix: R? = null,
postfix: R? = null,
crossinline transform: (I) -> R?
): List<R> {
val result = mutableListOf<R>()
val iterator = iterator()
prefix ?.let(result::add)
while (iterator.hasNext()) {
val element = iterator.next()
result.add(transform(element) ?: continue)
if (iterator.hasNext()) {
result.add(separatorFun(element) ?: continue)
}
}
postfix ?.let(result::add)
return result
}
inline fun <I, R> Iterable<I>.joinTo(
separator: R? = null,
prefix: R? = null,
postfix: R? = null,
crossinline transform: (I) -> R?
): List<R> = joinTo({ separator }, prefix, postfix, transform)
inline fun <I> Iterable<I>.joinTo(
crossinline separatorFun: (I) -> I?,
prefix: I? = null,
postfix: I? = null
): List<I> = joinTo<I, I>(separatorFun, prefix, postfix) { it }
inline fun <I> Iterable<I>.joinTo(
separator: I? = null,
prefix: I? = null,
postfix: I? = null
): List<I> = joinTo<I>({ separator }, prefix, postfix)
inline fun <I, reified R> Array<I>.joinTo(
crossinline separatorFun: (I) -> R?,
prefix: R? = null,
postfix: R? = null,
crossinline transform: (I) -> R?
): Array<R> = asIterable().joinTo(separatorFun, prefix, postfix, transform).toTypedArray()
inline fun <I, reified R> Array<I>.joinTo(
separator: R? = null,
prefix: R? = null,
postfix: R? = null,
crossinline transform: (I) -> R?
): Array<R> = asIterable().joinTo(separator, prefix, postfix, transform).toTypedArray()

View File

@@ -7,7 +7,7 @@ import kotlin.jvm.JvmInline
@JvmInline
value class FileName(val string: String) {
val name: String
get() = string.takeLastWhile { it != '/' }
get() = withoutSlashAtTheEnd.takeLastWhile { it != '/' }
val extension: String
get() = name.takeLastWhile { it != '.' }
val nameWithoutExtension: String
@@ -17,6 +17,8 @@ value class FileName(val string: String) {
filename.substring(0, it)
} ?: filename
}
val withoutSlashAtTheEnd: String
get() = string.dropLastWhile { it == '/' }
override fun toString(): String = string
}

View File

@@ -11,7 +11,7 @@ class DiffUtilsTests {
val withIndex = oldList.withIndex()
for (count in 1 .. (floor(oldList.size.toFloat() / 2).toInt())) {
for ((i, v) in withIndex) {
for ((i, _) in withIndex) {
if (i + count > oldList.lastIndex) {
continue
}

View File

@@ -147,3 +147,10 @@ suspend inline fun <T> runCatchingSafelyWithoutExceptions(
): Result<T?> = runCatching {
safelyWithoutExceptions(onException, block)
}
inline fun CoroutineScope(
context: CoroutineContext,
noinline defaultExceptionsHandler: ExceptionHandler<Unit>
) = CoroutineScope(
context + ContextSafelyExceptionHandler(defaultExceptionsHandler)
)

View File

@@ -7,29 +7,29 @@ android.useAndroidX=true
android.enableJetifier=true
org.gradle.jvmargs=-Xmx2g
kotlin_version=1.5.21
kotlin_coroutines_version=1.5.1
kotlin_version=1.5.30
kotlin_coroutines_version=1.5.2
kotlin_serialisation_core_version=1.2.2
kotlin_exposed_version=0.33.1
kotlin_exposed_version=0.34.1
ktor_version=1.6.2
ktor_version=1.6.3
klockVersion=2.3.1
klockVersion=2.4.1
github_release_plugin_version=2.2.12
uuidVersion=0.3.0
uuidVersion=0.3.1
# ANDROID
core_ktx_version=1.6.0
androidx_recycler_version=1.2.1
appcompat_version=1.3.0
appcompat_version=1.3.1
android_minSdkVersion=19
android_compileSdkVersion=30
android_buildToolsVersion=30.0.3
dexcount_version=2.1.0-RC01
dexcount_version=3.0.0
junit_version=4.12
test_ext_junit_version=1.1.2
espresso_core=3.3.0
@@ -45,5 +45,5 @@ dokka_version=1.5.0
# Project data
group=dev.inmo
version=0.5.19
android_code_version=60
version=0.5.26
android_code_version=67

View File

@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View File

@@ -2,6 +2,8 @@ package dev.inmo.micro_utils.repos
import android.database.Cursor
import android.database.sqlite.SQLiteDatabase
import androidx.core.database.*
import dev.inmo.micro_utils.repos.getLongOrNull
fun createTableQuery(
tableName: String,
@@ -32,6 +34,11 @@ fun SQLiteDatabase.createTable(
fun Cursor.getString(columnName: String): String = getString(
getColumnIndexOrThrow(columnName)
)
fun Cursor.getStringOrNull(columnName: String): String? {
return getStringOrNull(
getColumnIndex(columnName).takeIf { it != -1 } ?: return null
)
}
/**
* @throws IllegalArgumentException
@@ -39,6 +46,11 @@ fun Cursor.getString(columnName: String): String = getString(
fun Cursor.getShort(columnName: String): Short = getShort(
getColumnIndexOrThrow(columnName)
)
fun Cursor.getShortOrNull(columnName: String): Short? {
return getShortOrNull(
getColumnIndex(columnName).takeIf { it != -1 } ?: return null
)
}
/**
* @throws IllegalArgumentException
@@ -46,6 +58,11 @@ fun Cursor.getShort(columnName: String): Short = getShort(
fun Cursor.getLong(columnName: String): Long = getLong(
getColumnIndexOrThrow(columnName)
)
fun Cursor.getLongOrNull(columnName: String): Long? {
return getLongOrNull(
getColumnIndex(columnName).takeIf { it != -1 } ?: return null
)
}
/**
* @throws IllegalArgumentException
@@ -53,6 +70,23 @@ fun Cursor.getLong(columnName: String): Long = getLong(
fun Cursor.getInt(columnName: String): Int = getInt(
getColumnIndexOrThrow(columnName)
)
fun Cursor.getIntOrNull(columnName: String): Int? {
return getIntOrNull(
getColumnIndex(columnName).takeIf { it != -1 } ?: return null
)
}
/**
* @throws IllegalArgumentException
*/
fun Cursor.getFloat(columnName: String): Float = getFloat(
getColumnIndexOrThrow(columnName)
)
fun Cursor.getFloatOrNull(columnName: String): Float? {
return getFloatOrNull(
getColumnIndex(columnName).takeIf { it != -1 } ?: return null
)
}
/**
* @throws IllegalArgumentException
@@ -60,6 +94,11 @@ fun Cursor.getInt(columnName: String): Int = getInt(
fun Cursor.getDouble(columnName: String): Double = getDouble(
getColumnIndexOrThrow(columnName)
)
fun Cursor.getDoubleOrNull(columnName: String): Double? {
return getDoubleOrNull(
getColumnIndex(columnName).takeIf { it != -1 } ?: return null
)
}
fun SQLiteDatabase.select(
table: String,

View File

@@ -23,13 +23,13 @@ class ReadMapCRUDRepo<ObjectType, IdType>(
}
abstract class WriteMapCRUDRepo<ObjectType, IdType, InputValueType>(
private val map: MutableMap<IdType, ObjectType> = mutableMapOf()
protected val map: MutableMap<IdType, ObjectType> = mutableMapOf()
) : WriteStandardCRUDRepo<ObjectType, IdType, InputValueType> {
private val _newObjectsFlow: MutableSharedFlow<ObjectType> = MutableSharedFlow()
protected val _newObjectsFlow: MutableSharedFlow<ObjectType> = MutableSharedFlow()
override val newObjectsFlow: Flow<ObjectType> = _newObjectsFlow.asSharedFlow()
private val _updatedObjectsFlow: MutableSharedFlow<ObjectType> = MutableSharedFlow()
protected val _updatedObjectsFlow: MutableSharedFlow<ObjectType> = MutableSharedFlow()
override val updatedObjectsFlow: Flow<ObjectType> = _updatedObjectsFlow.asSharedFlow()
private val _deletedObjectsIdsFlow: MutableSharedFlow<IdType> = MutableSharedFlow()
protected val _deletedObjectsIdsFlow: MutableSharedFlow<IdType> = MutableSharedFlow()
override val deletedObjectsIdsFlow: Flow<IdType> = _deletedObjectsIdsFlow.asSharedFlow()
protected abstract suspend fun updateObject(newValue: InputValueType, id: IdType, old: ObjectType): ObjectType

View File

@@ -8,7 +8,7 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableSharedFlow
class ReadMapKeyValueRepo<Key, Value>(
private val map: Map<Key, Value> = emptyMap()
protected val map: Map<Key, Value> = emptyMap()
) : ReadStandardKeyValueRepo<Key, Value> {
override suspend fun get(k: Key): Value? = map[k]

View File

@@ -8,11 +8,24 @@ import kotlin.reflect.KClass
open class TypedSerializer<T : Any>(
kClass: KClass<T>,
presetSerializers: Map<String, KSerializer<out T>> = emptyMap()
presetSerializers: Map<String, KSerializer<out T>> = emptyMap(),
) : KSerializer<T> {
protected val serializers = presetSerializers.toMutableMap()
@ExperimentalSerializationApi
@InternalSerializationApi
open override val descriptor: SerialDescriptor = buildSerialDescriptor(
override val descriptor: SerialDescriptor = buildSerialDescriptor(
"TypedSerializer",
SerialKind.CONTEXTUAL
) {
element("type", String.serializer().descriptor)
element("value", ContextualSerializer(kClass).descriptor)
}
@InternalSerializationApi
@Deprecated(
"This descriptor was deprecated due to incorrect serial name. You may use it in case something require it, " +
"but it is strongly recommended to migrate onto new descriptor"
)
protected val oldDescriptor: SerialDescriptor = buildSerialDescriptor(
"TextSourceSerializer",
SerialKind.CONTEXTUAL
) {
@@ -20,8 +33,9 @@ open class TypedSerializer<T : Any>(
element("value", ContextualSerializer(kClass).descriptor)
}
@ExperimentalSerializationApi
@InternalSerializationApi
open override fun deserialize(decoder: Decoder): T {
override fun deserialize(decoder: Decoder): T {
return decoder.decodeStructure(descriptor) {
var type: String? = null
lateinit var result: T
@@ -44,13 +58,15 @@ open class TypedSerializer<T : Any>(
}
}
@ExperimentalSerializationApi
@InternalSerializationApi
protected open fun <O: T> CompositeEncoder.encode(value: O) {
encodeSerializableElement(descriptor, 1, value::class.serializer() as KSerializer<O>, value)
}
@ExperimentalSerializationApi
@InternalSerializationApi
open override fun serialize(encoder: Encoder, value: T) {
override fun serialize(encoder: Encoder, value: T) {
encoder.encodeStructure(descriptor) {
val valueSerializer = value::class.serializer()
val type = serializers.keys.first { serializers[it] == valueSerializer }
@@ -69,6 +85,16 @@ open class TypedSerializer<T : Any>(
}
}
@InternalSerializationApi
operator fun <T : Any> TypedSerializer<T>.plusAssign(kClass: KClass<T>) {
include(kClass.simpleName!!, kClass.serializer())
}
@InternalSerializationApi
operator fun <T : Any> TypedSerializer<T>.minusAssign(kClass: KClass<T>) {
exclude(kClass.simpleName!!)
}
inline fun <reified T : Any> TypedSerializer(
presetSerializers: Map<String, KSerializer<out T>> = emptyMap()
) = TypedSerializer(T::class, presetSerializers)