mirror of
https://github.com/InsanusMokrassar/MicroUtils.git
synced 2025-10-10 18:00:33 +00:00
Compare commits
29 Commits
Author | SHA1 | Date | |
---|---|---|---|
f6a06ee8ea | |||
2644f27975 | |||
3dc68a7b8b | |||
97fc1d6239 | |||
662f4d22a3 | |||
b70aa12be9 | |||
71f12f5f19 | |||
e10504eeeb | |||
2dea9f3bc0 | |||
35c9dda5bc | |||
e831f3949a | |||
b0b39cc693 | |||
fc03be3f73 | |||
b61f6b81f1 | |||
f5bc1c1fce | |||
a729f9568c | |||
5749e00377 | |||
ef73c24a0c | |||
94717ee351 | |||
9a18ded65b | |||
b23220f491 | |||
6e6bb03246 | |||
1ae6bae3b8 | |||
1239ca3256 | |||
57b7797ea4 | |||
5ee5bfd1d5 | |||
7229a3e198 | |||
bee083582f | |||
6ef403853c |
39
CHANGELOG.md
39
CHANGELOG.md
@@ -1,7 +1,46 @@
|
||||
# Changelog
|
||||
|
||||
## 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`:
|
||||
* `IetfLanguageCode` became as sealed class
|
||||
* `IetfLanguageCode` now override `toString` and returns its code
|
||||
|
||||
## 0.5.18
|
||||
|
||||
* `Versions`
|
||||
* `Kotlin Exposed`: `0.32.1` -> `0.33.1`
|
||||
* `LanguageCode`:
|
||||
* Module has been created
|
||||
|
||||
|
@@ -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)
|
||||
|
@@ -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()
|
@@ -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
|
||||
}
|
||||
|
@@ -7,14 +7,14 @@ android.useAndroidX=true
|
||||
android.enableJetifier=true
|
||||
org.gradle.jvmargs=-Xmx2g
|
||||
|
||||
kotlin_version=1.5.21
|
||||
kotlin_version=1.5.30
|
||||
kotlin_coroutines_version=1.5.1
|
||||
kotlin_serialisation_core_version=1.2.2
|
||||
kotlin_exposed_version=0.32.1
|
||||
kotlin_exposed_version=0.34.1
|
||||
|
||||
ktor_version=1.6.2
|
||||
ktor_version=1.6.3
|
||||
|
||||
klockVersion=2.3.1
|
||||
klockVersion=2.3.4
|
||||
|
||||
github_release_plugin_version=2.2.12
|
||||
|
||||
@@ -24,12 +24,12 @@ uuidVersion=0.3.0
|
||||
|
||||
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
|
||||
@@ -40,10 +40,10 @@ crypto_js_version=4.1.1
|
||||
|
||||
# Dokka
|
||||
|
||||
dokka_version=1.4.32
|
||||
dokka_version=1.5.0
|
||||
|
||||
# Project data
|
||||
|
||||
group=dev.inmo
|
||||
version=0.5.18
|
||||
android_code_version=59
|
||||
version=0.5.23
|
||||
android_code_version=64
|
||||
|
@@ -5,6 +5,7 @@ import kotlinx.serialization.Serializable
|
||||
import kotlinx.serialization.builtins.ListSerializer
|
||||
import kotlinx.serialization.json.Json
|
||||
import java.io.File
|
||||
import java.text.Normalizer
|
||||
|
||||
private val json = Json {
|
||||
ignoreUnknownKeys = true
|
||||
@@ -29,6 +30,8 @@ fun String.adaptAsTitle() = if (first().isDigit()) {
|
||||
this
|
||||
}
|
||||
|
||||
fun String.normalized() = Normalizer.normalize(this, Normalizer.Form.NFD).replace(Regex("[^\\p{ASCII}]"), "")
|
||||
|
||||
@Serializable
|
||||
private data class LanguageCodeWithTag(
|
||||
@SerialName("langType")
|
||||
@@ -74,11 +77,11 @@ private fun printLanguageCodeAndTags(
|
||||
indents: String = " "
|
||||
): String = if (tag.subtags.isEmpty()) {
|
||||
"""${indents}${baseClassSerializerAnnotationName}
|
||||
${indents}object ${tag.title} : ${parent ?.title ?.let { "$it()" } ?: baseClassName} { override val code: String = "${tag.tag}" }"""
|
||||
${indents}object ${tag.title} : ${parent ?.title ?: baseClassName}() { override val code: String = "${tag.tag}" }"""
|
||||
} else {
|
||||
"""
|
||||
${indents}${baseClassSerializerAnnotationName}
|
||||
${indents}sealed class ${tag.title} : ${parent ?.title ?.let { "$it()" } ?: baseClassName} {
|
||||
${indents}sealed class ${tag.title} : ${parent ?.title ?: baseClassName}() {
|
||||
${indents} override val code: String = "${tag.tag}"
|
||||
|
||||
${tag.subtags.joinToString("\n") { printLanguageCodeAndTags(it, tag, "${indents} ") }}
|
||||
@@ -98,13 +101,15 @@ import kotlinx.serialization.Serializable
|
||||
* https://datahub.io/core/language-codes/ files (base and tags) and create the whole hierarchy using it.
|
||||
*/
|
||||
${baseClassSerializerAnnotationName}
|
||||
sealed interface $baseClassName {
|
||||
val code: String
|
||||
sealed class $baseClassName {
|
||||
abstract val code: String
|
||||
|
||||
${tags.joinToString("\n") { printLanguageCodeAndTags(it, indents = " ") } }
|
||||
|
||||
$baseClassSerializerAnnotationName
|
||||
data class $unknownBaseClassName (override val code: String) : $baseClassName
|
||||
data class $unknownBaseClassName (override val code: String) : $baseClassName()
|
||||
|
||||
override fun toString() = code
|
||||
}
|
||||
""".trimIndent()
|
||||
|
||||
@@ -179,18 +184,14 @@ suspend fun main(vararg args: String) {
|
||||
val subtags = unformattedSubtags.mapNotNull {
|
||||
if (it.endTag == null) {
|
||||
val currentSubtags = (threeLevelTags[it.subtag] ?: emptyList()).map {
|
||||
Tag(it.endTagAsTitle!!, it.withSubtag, emptyList())
|
||||
Tag(it.endTagAsTitle!!.normalized(), it.withSubtag, emptyList())
|
||||
}
|
||||
Tag(it.middleTagTitle, it.withSubtag, currentSubtags)
|
||||
Tag(it.middleTagTitle.normalized(), it.withSubtag, currentSubtags)
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}
|
||||
Tag(
|
||||
it.title,
|
||||
it.tag,
|
||||
subtags
|
||||
)
|
||||
Tag(it.title.normalized(), it.tag, subtags)
|
||||
}
|
||||
|
||||
File(outputFolder, "LanguageCodes.kt").apply {
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -461,9 +461,9 @@ fun String.asIetfLanguageCode(): IetfLanguageCode {
|
||||
IetfLanguageCode.Burmese.code -> IetfLanguageCode.Burmese
|
||||
IetfLanguageCode.Burmese.MM.code -> IetfLanguageCode.Burmese.MM
|
||||
IetfLanguageCode.Nauru.code -> IetfLanguageCode.Nauru
|
||||
IetfLanguageCode.BokmålNorwegianNorwegianBokmål.code -> IetfLanguageCode.BokmålNorwegianNorwegianBokmål
|
||||
IetfLanguageCode.BokmålNorwegianNorwegianBokmål.NO.code -> IetfLanguageCode.BokmålNorwegianNorwegianBokmål.NO
|
||||
IetfLanguageCode.BokmålNorwegianNorwegianBokmål.SJ.code -> IetfLanguageCode.BokmålNorwegianNorwegianBokmål.SJ
|
||||
IetfLanguageCode.BokmalNorwegianNorwegianBokmal.code -> IetfLanguageCode.BokmalNorwegianNorwegianBokmal
|
||||
IetfLanguageCode.BokmalNorwegianNorwegianBokmal.NO.code -> IetfLanguageCode.BokmalNorwegianNorwegianBokmal.NO
|
||||
IetfLanguageCode.BokmalNorwegianNorwegianBokmal.SJ.code -> IetfLanguageCode.BokmalNorwegianNorwegianBokmal.SJ
|
||||
IetfLanguageCode.NdebeleNorthNorthNdebele.code -> IetfLanguageCode.NdebeleNorthNorthNdebele
|
||||
IetfLanguageCode.NdebeleNorthNorthNdebele.ZW.code -> IetfLanguageCode.NdebeleNorthNorthNdebele.ZW
|
||||
IetfLanguageCode.Nepali.code -> IetfLanguageCode.Nepali
|
||||
@@ -639,8 +639,8 @@ fun String.asIetfLanguageCode(): IetfLanguageCode {
|
||||
IetfLanguageCode.Venda.code -> IetfLanguageCode.Venda
|
||||
IetfLanguageCode.Vietnamese.code -> IetfLanguageCode.Vietnamese
|
||||
IetfLanguageCode.Vietnamese.VN.code -> IetfLanguageCode.Vietnamese.VN
|
||||
IetfLanguageCode.Volapük.code -> IetfLanguageCode.Volapük
|
||||
IetfLanguageCode.Volapük.L001.code -> IetfLanguageCode.Volapük.L001
|
||||
IetfLanguageCode.Volapuk.code -> IetfLanguageCode.Volapuk
|
||||
IetfLanguageCode.Volapuk.L001.code -> IetfLanguageCode.Volapuk.L001
|
||||
IetfLanguageCode.Walloon.code -> IetfLanguageCode.Walloon
|
||||
IetfLanguageCode.Wolof.code -> IetfLanguageCode.Wolof
|
||||
IetfLanguageCode.Wolof.SN.code -> IetfLanguageCode.Wolof.SN
|
||||
|
@@ -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,
|
||||
|
@@ -8,11 +8,23 @@ 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()
|
||||
@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
|
||||
) {
|
||||
|
Reference in New Issue
Block a user