mirror of
https://github.com/InsanusMokrassar/MicroUtils.git
synced 2025-09-17 22:39:25 +00:00
Compare commits
73 Commits
Author | SHA1 | Date | |
---|---|---|---|
2eedd196d2 | |||
759a3f2784 | |||
386fa830c3 | |||
c382423d77 | |||
bb466ce66c | |||
72cd3dd8a1 | |||
|
595cedaaf1 | ||
eeaceb6cf5 | |||
1bd671685b | |||
48d3fe41f2 | |||
7ab21871cd | |||
65d01b1fb3 | |||
6230accb68 | |||
c6ed821934 | |||
10e03bb951 | |||
aa4f392948 | |||
f51b59ec02 | |||
8c76834ae4 | |||
4a454f3d67 | |||
151aa1863d | |||
3bf6896296 | |||
0d01561476 | |||
f6ded92251 | |||
d01b735cc6 | |||
6c12001080 | |||
1afbf03606 | |||
f6ef5c61c5 | |||
c18fee8107 | |||
d9df7a4384 | |||
87c2230e8e | |||
da7eb6de0a | |||
ed3815118f | |||
be726f42bd | |||
a91006132f | |||
9a9f741a0b | |||
5028f130e9 | |||
77fa019651 | |||
9715da9384 | |||
f6d5035c1a | |||
43e782ab6f | |||
f3f9920bfb | |||
2bfd615812 | |||
ebfacb3659 | |||
c71d557eec | |||
e0398cef21 | |||
f91599e9c6 | |||
f8f9f93c97 | |||
a8a5340d8b | |||
871b27f37d | |||
6f174cae1d | |||
22d7ac3e22 | |||
9b30c3a155 | |||
915bac64b1 | |||
9d2b50e55d | |||
bde100f63d | |||
05b035a13d | |||
eefb56bed7 | |||
fcc0dc4189 | |||
47ff20317f | |||
1558b9103d | |||
7a78742162 | |||
c01e240f66 | |||
fef4fcbac6 | |||
5ab18bce4b | |||
24aec7271a | |||
9b19a2cb95 | |||
efdd7b8a57 | |||
6df4cc9c3b | |||
b9d93db0f5 | |||
d7ee45ca64 | |||
d7c31b1b22 | |||
7d6794a358 | |||
473eb87346 |
2
.github/workflows/build.yml
vendored
2
.github/workflows/build.yml
vendored
@@ -8,7 +8,7 @@ jobs:
|
|||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- uses: actions/setup-java@v1
|
- uses: actions/setup-java@v1
|
||||||
with:
|
with:
|
||||||
java-version: 11
|
java-version: 17
|
||||||
- name: Rewrite version
|
- name: Rewrite version
|
||||||
run: |
|
run: |
|
||||||
branch="`echo "${{ github.ref }}" | grep -o "[^/]*$"`"
|
branch="`echo "${{ github.ref }}" | grep -o "[^/]*$"`"
|
||||||
|
2
.github/workflows/dokka_push.yml
vendored
2
.github/workflows/dokka_push.yml
vendored
@@ -10,7 +10,7 @@ jobs:
|
|||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- uses: actions/setup-java@v1
|
- uses: actions/setup-java@v1
|
||||||
with:
|
with:
|
||||||
java-version: 11
|
java-version: 17
|
||||||
- name: Build
|
- name: Build
|
||||||
run: ./gradlew build && ./gradlew dokkaHtml
|
run: ./gradlew build && ./gradlew dokkaHtml
|
||||||
- name: Publish KDocs
|
- name: Publish KDocs
|
||||||
|
90
CHANGELOG.md
90
CHANGELOG.md
@@ -1,5 +1,95 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 0.20.24
|
||||||
|
|
||||||
|
**Since this version depdendencies of klock and krypto replaced with `com.soywiz.korge:korlibs-time` and `com.soywiz.korge:korlibs-crypto`**
|
||||||
|
|
||||||
|
* `Versions`:
|
||||||
|
* `Klock` (since now `KorlibsTime`): `4.0.10` -> `5.3.0`
|
||||||
|
* `Krypto` (since now `KorlibsCrypto`): `4.0.10` -> `5.3.0`
|
||||||
|
* `Serialization`:
|
||||||
|
* `Mapper`:
|
||||||
|
* `Mapper` pass decoder into callback of deserialization strategy
|
||||||
|
* `Mapper` pass encoder into callback of serialization strategy
|
||||||
|
|
||||||
|
## 0.20.23
|
||||||
|
|
||||||
|
* `Versions`:
|
||||||
|
* `Koin`: `3.5.0` -> `3.5.3`
|
||||||
|
* `Okio`: `3.6.0` -> `3.7.0`
|
||||||
|
* `LanguageCodes`:
|
||||||
|
* Fixes in intermediate language codes (like `Chinese.Hans`)
|
||||||
|
* Rename `IetfLanguageCode` to `IetfLang`
|
||||||
|
* Rename all subsequent functions (including serializer)
|
||||||
|
* New lazy properties `knownLanguageCodesMap`, `knownLanguageCodesMapByLowerCasedKeys` and several others
|
||||||
|
|
||||||
|
## 0.20.22
|
||||||
|
|
||||||
|
* `Common`:
|
||||||
|
* Add opportunity to create own `Diff` with base constructor
|
||||||
|
|
||||||
|
## 0.20.21
|
||||||
|
|
||||||
|
* `Resources`:
|
||||||
|
* Inited
|
||||||
|
|
||||||
|
## 0.20.20
|
||||||
|
|
||||||
|
* `Repos`:
|
||||||
|
* `Exposed`:
|
||||||
|
* Add opportunity for setup flows in `AbstractExposedCRUDRepo`
|
||||||
|
|
||||||
|
## 0.20.19
|
||||||
|
|
||||||
|
* `Versions`:
|
||||||
|
* `Ktor`: `2.3.6` -> `2.3.7`
|
||||||
|
|
||||||
|
## 0.20.18
|
||||||
|
|
||||||
|
* `Coroutines`:
|
||||||
|
* `SpecialMutableStateFlow` now extends `MutableStateFlow`
|
||||||
|
* `Compose`:
|
||||||
|
* Deprecate `FlowState` due to its complexity in fixes
|
||||||
|
|
||||||
|
## 0.20.17
|
||||||
|
|
||||||
|
* `Versions`:
|
||||||
|
* `Serialization`: `1.6.1` -> `1.6.2`
|
||||||
|
|
||||||
|
## 0.20.16
|
||||||
|
|
||||||
|
* `Versions`:
|
||||||
|
* `Exposed`: `0.44.1` -> `0.45.0`
|
||||||
|
* `Coroutines`:
|
||||||
|
* Add `SpecialMutableStateFlow`
|
||||||
|
* `Compose`:
|
||||||
|
* Add `FlowState`
|
||||||
|
|
||||||
|
## 0.20.15
|
||||||
|
|
||||||
|
* `Versions`:
|
||||||
|
* `Kotlin`: `1.9.20` -> `1.9.21`
|
||||||
|
* `KSLog`: `1.3.0` -> `1.3.1`
|
||||||
|
* `Compose`: `1.5.10` -> `1.5.11`
|
||||||
|
|
||||||
|
## 0.20.14
|
||||||
|
|
||||||
|
* `Versions`:
|
||||||
|
* `Serialization`: `1.6.0` -> `1.6.1`
|
||||||
|
* `KSLog`: `1.2.4` -> `1.3.0`
|
||||||
|
|
||||||
|
## 0.20.13
|
||||||
|
|
||||||
|
* `Versions`:
|
||||||
|
* `Ktor`: `2.3.5` -> `2.3.6`
|
||||||
|
* `UUID`: `0.8.1` -> `0.8.2`
|
||||||
|
|
||||||
|
## 0.20.12
|
||||||
|
|
||||||
|
**It is experimental migration onto new gradle version. Be careful in use of this version**
|
||||||
|
|
||||||
|
**This update have JDK 17 in `compatibility` and `target` versions**
|
||||||
|
|
||||||
## 0.20.11
|
## 0.20.11
|
||||||
|
|
||||||
* `Versions`:
|
* `Versions`:
|
||||||
|
@@ -27,7 +27,7 @@ allprojects {
|
|||||||
mavenCentral()
|
mavenCentral()
|
||||||
google()
|
google()
|
||||||
maven { url "https://maven.pkg.jetbrains.space/public/p/compose/dev" }
|
maven { url "https://maven.pkg.jetbrains.space/public/p/compose/dev" }
|
||||||
maven { url "https://git.inmo.dev/api/packages/InsanusMokrassar/maven" }
|
maven { url "https://nexus.inmo.dev/repository/maven-releases/" }
|
||||||
}
|
}
|
||||||
|
|
||||||
// temporal crutch until legacy tests will be stabled or legacy target will be removed
|
// temporal crutch until legacy tests will be stabled or legacy target will be removed
|
||||||
|
@@ -27,7 +27,7 @@ private inline fun <T> getObject(
|
|||||||
* @see calculateDiff
|
* @see calculateDiff
|
||||||
*/
|
*/
|
||||||
@Serializable
|
@Serializable
|
||||||
data class Diff<T> internal constructor(
|
data class Diff<T> @Warning(warning) constructor(
|
||||||
val removed: List<@Serializable(IndexedValueSerializer::class) IndexedValue<T>>,
|
val removed: List<@Serializable(IndexedValueSerializer::class) IndexedValue<T>>,
|
||||||
/**
|
/**
|
||||||
* Old-New values pairs
|
* Old-New values pairs
|
||||||
@@ -36,6 +36,10 @@ data class Diff<T> internal constructor(
|
|||||||
val added: List<@Serializable(IndexedValueSerializer::class) IndexedValue<T>>
|
val added: List<@Serializable(IndexedValueSerializer::class) IndexedValue<T>>
|
||||||
) {
|
) {
|
||||||
fun isEmpty(): Boolean = removed.isEmpty() && replaced.isEmpty() && added.isEmpty()
|
fun isEmpty(): Boolean = removed.isEmpty() && replaced.isEmpty() && added.isEmpty()
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val warning = "This feature can be changed without any warranties. Use with caution and only in case you know what you are doing"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <T> emptyDiff(): Diff<T> = Diff(emptyList(), emptyList(), emptyList())
|
fun <T> emptyDiff(): Diff<T> = Diff(emptyList(), emptyList(), emptyList())
|
||||||
|
@@ -0,0 +1,46 @@
|
|||||||
|
package dev.inmo.micro_utils.coroutines.compose
|
||||||
|
|
||||||
|
import androidx.compose.runtime.MutableState
|
||||||
|
import dev.inmo.micro_utils.coroutines.SpecialMutableStateFlow
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This type works like [MutableState], [kotlinx.coroutines.flow.StateFlow] and [kotlinx.coroutines.flow.MutableSharedFlow].
|
||||||
|
* Based on [SpecialMutableStateFlow]
|
||||||
|
*/
|
||||||
|
@Deprecated("Will be removed soon")
|
||||||
|
class FlowState<T>(
|
||||||
|
initial: T,
|
||||||
|
internalScope: CoroutineScope = CoroutineScope(Dispatchers.Default)
|
||||||
|
) : MutableState<T>,
|
||||||
|
SpecialMutableStateFlow<T>(initial, internalScope) {
|
||||||
|
private var internalValue: T = initial
|
||||||
|
override var value: T
|
||||||
|
get() = internalValue
|
||||||
|
set(value) {
|
||||||
|
internalValue = value
|
||||||
|
tryEmit(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onChangeWithoutSync(value: T) {
|
||||||
|
internalValue = value
|
||||||
|
super.onChangeWithoutSync(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun component1(): T = value
|
||||||
|
|
||||||
|
override fun component2(): (T) -> Unit = { tryEmit(it) }
|
||||||
|
|
||||||
|
override fun tryEmit(value: T): Boolean {
|
||||||
|
internalValue = value
|
||||||
|
return super.tryEmit(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun emit(value: T) {
|
||||||
|
internalValue = value
|
||||||
|
super.emit(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//fun <T> MutableState<T>.asFlowState(scope: CoroutineScope = CoroutineScope(Dispatchers.Main)) = FlowState(this, scope)
|
@@ -0,0 +1,86 @@
|
|||||||
|
package dev.inmo.micro_utils.coroutines
|
||||||
|
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||||
|
import kotlinx.coroutines.InternalCoroutinesApi
|
||||||
|
import kotlinx.coroutines.channels.BufferOverflow
|
||||||
|
import kotlinx.coroutines.flow.FlowCollector
|
||||||
|
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||||
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
|
import kotlinx.coroutines.internal.SynchronizedObject
|
||||||
|
import kotlinx.coroutines.internal.synchronized
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Works like [StateFlow], but guarantee that latest value update will always be delivered to
|
||||||
|
* each active subscriber
|
||||||
|
*/
|
||||||
|
open class SpecialMutableStateFlow<T>(
|
||||||
|
initialValue: T,
|
||||||
|
internalScope: CoroutineScope = CoroutineScope(Dispatchers.Default)
|
||||||
|
) : MutableStateFlow<T>, FlowCollector<T>, MutableSharedFlow<T> {
|
||||||
|
@OptIn(InternalCoroutinesApi::class)
|
||||||
|
private val syncObject = SynchronizedObject()
|
||||||
|
protected val internalSharedFlow: MutableSharedFlow<T> = MutableSharedFlow(
|
||||||
|
replay = 0,
|
||||||
|
extraBufferCapacity = 2,
|
||||||
|
onBufferOverflow = BufferOverflow.DROP_OLDEST
|
||||||
|
)
|
||||||
|
protected val publicSharedFlow: MutableSharedFlow<T> = MutableSharedFlow(
|
||||||
|
replay = 1,
|
||||||
|
extraBufferCapacity = 1,
|
||||||
|
onBufferOverflow = BufferOverflow.DROP_OLDEST
|
||||||
|
)
|
||||||
|
|
||||||
|
protected var _value: T = initialValue
|
||||||
|
override var value: T
|
||||||
|
get() = _value
|
||||||
|
set(value) {
|
||||||
|
doOnChangeAction(value)
|
||||||
|
}
|
||||||
|
protected val job = internalSharedFlow.subscribe(internalScope) {
|
||||||
|
doOnChangeAction(it)
|
||||||
|
}
|
||||||
|
|
||||||
|
override val replayCache: List<T>
|
||||||
|
get() = publicSharedFlow.replayCache
|
||||||
|
override val subscriptionCount: StateFlow<Int>
|
||||||
|
get() = publicSharedFlow.subscriptionCount
|
||||||
|
|
||||||
|
@OptIn(InternalCoroutinesApi::class)
|
||||||
|
override fun compareAndSet(expect: T, update: T): Boolean {
|
||||||
|
return synchronized(syncObject) {
|
||||||
|
if (expect == _value && update != _value) {
|
||||||
|
doOnChangeAction(update)
|
||||||
|
}
|
||||||
|
expect == _value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected open fun onChangeWithoutSync(value: T) {
|
||||||
|
_value = value
|
||||||
|
publicSharedFlow.tryEmit(value)
|
||||||
|
}
|
||||||
|
@OptIn(InternalCoroutinesApi::class)
|
||||||
|
protected open fun doOnChangeAction(value: T) {
|
||||||
|
synchronized(syncObject) {
|
||||||
|
if (_value != value) {
|
||||||
|
onChangeWithoutSync(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ExperimentalCoroutinesApi
|
||||||
|
override fun resetReplayCache() = publicSharedFlow.resetReplayCache()
|
||||||
|
|
||||||
|
override fun tryEmit(value: T): Boolean {
|
||||||
|
return internalSharedFlow.tryEmit(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun emit(value: T) {
|
||||||
|
internalSharedFlow.emit(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun collect(collector: FlowCollector<T>) = publicSharedFlow.collect(collector)
|
||||||
|
}
|
@@ -27,7 +27,7 @@ android {
|
|||||||
}
|
}
|
||||||
|
|
||||||
compileOptions {
|
compileOptions {
|
||||||
sourceCompatibility JavaVersion.VERSION_1_8
|
sourceCompatibility JavaVersion.VERSION_17
|
||||||
targetCompatibility JavaVersion.VERSION_1_8
|
targetCompatibility JavaVersion.VERSION_17
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -6,7 +6,7 @@ kotlin.incremental.js=true
|
|||||||
#kotlin.experimental.tryK2=true
|
#kotlin.experimental.tryK2=true
|
||||||
android.useAndroidX=true
|
android.useAndroidX=true
|
||||||
android.enableJetifier=true
|
android.enableJetifier=true
|
||||||
org.gradle.jvmargs=-Xmx2500m
|
org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=2g
|
||||||
|
|
||||||
# JS NPM
|
# JS NPM
|
||||||
|
|
||||||
@@ -15,5 +15,5 @@ crypto_js_version=4.1.1
|
|||||||
# Project data
|
# Project data
|
||||||
|
|
||||||
group=dev.inmo
|
group=dev.inmo
|
||||||
version=0.20.11
|
version=0.20.24
|
||||||
android_code_version=217
|
android_code_version=230
|
||||||
|
@@ -1,39 +1,38 @@
|
|||||||
[versions]
|
[versions]
|
||||||
|
|
||||||
kt = "1.9.20"
|
kt = "1.9.21"
|
||||||
#compose-kotlin = "1.5.10-beta02"
|
kt-serialization = "1.6.2"
|
||||||
kt-serialization = "1.6.0"
|
|
||||||
kt-coroutines = "1.7.3"
|
kt-coroutines = "1.7.3"
|
||||||
|
|
||||||
kslog = "1.2.2"
|
kslog = "1.3.1"
|
||||||
|
|
||||||
jb-compose = "1.5.10"
|
jb-compose = "1.5.11"
|
||||||
jb-exposed = "0.44.1"
|
jb-exposed = "0.45.0"
|
||||||
jb-dokka = "1.9.10"
|
jb-dokka = "1.9.10"
|
||||||
|
|
||||||
korlibs = "4.0.10"
|
korlibs = "5.3.0"
|
||||||
uuid = "0.8.1"
|
uuid = "0.8.2"
|
||||||
|
|
||||||
ktor = "2.3.5"
|
ktor = "2.3.7"
|
||||||
|
|
||||||
gh-release = "2.4.1"
|
gh-release = "2.4.1"
|
||||||
|
|
||||||
koin = "3.5.0"
|
koin = "3.5.3"
|
||||||
|
|
||||||
okio = "3.6.0"
|
okio = "3.7.0"
|
||||||
|
|
||||||
ksp = "1.9.20-1.0.13"
|
ksp = "1.9.21-1.0.16"
|
||||||
kotlin-poet = "1.14.2"
|
kotlin-poet = "1.15.3"
|
||||||
|
|
||||||
versions = "0.49.0"
|
versions = "0.50.0"
|
||||||
|
|
||||||
android-gradle = "7.4.2"
|
android-gradle = "8.2.0"
|
||||||
dexcount = "4.0.0"
|
dexcount = "4.0.0"
|
||||||
|
|
||||||
android-coreKtx = "1.12.0"
|
android-coreKtx = "1.12.0"
|
||||||
android-recyclerView = "1.3.2"
|
android-recyclerView = "1.3.2"
|
||||||
android-appCompat = "1.6.1"
|
android-appCompat = "1.6.1"
|
||||||
android-fragment = "1.6.1"
|
android-fragment = "1.6.2"
|
||||||
android-espresso = "3.5.1"
|
android-espresso = "3.5.1"
|
||||||
android-test = "1.1.5"
|
android-test = "1.1.5"
|
||||||
android-compose-material3 = "1.1.2"
|
android-compose-material3 = "1.1.2"
|
||||||
@@ -73,8 +72,8 @@ ktor-server-content-negotiation = { module = "io.ktor:ktor-server-content-negoti
|
|||||||
|
|
||||||
kslog = { module = "dev.inmo:kslog", version.ref = "kslog" }
|
kslog = { module = "dev.inmo:kslog", version.ref = "kslog" }
|
||||||
|
|
||||||
klock = { module = "com.soywiz.korlibs.klock:klock", version.ref = "korlibs" }
|
klock = { module = "com.soywiz.korge:korlibs-time", version.ref = "korlibs" }
|
||||||
krypto = { module = "com.soywiz.korlibs.krypto:krypto", version.ref = "korlibs" }
|
krypto = { module = "com.soywiz.korge:korlibs-crypto", version.ref = "korlibs" }
|
||||||
uuid = { module = "com.benasher44:uuid", version.ref = "uuid" }
|
uuid = { module = "com.benasher44:uuid", version.ref = "uuid" }
|
||||||
koin = { module = "io.insert-koin:koin-core", version.ref = "koin" }
|
koin = { module = "io.insert-koin:koin-core", version.ref = "koin" }
|
||||||
|
|
||||||
|
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,5 +1,5 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
@@ -2,11 +2,11 @@ apply plugin: 'maven-publish'
|
|||||||
|
|
||||||
task javadocJar(type: Jar) {
|
task javadocJar(type: Jar) {
|
||||||
from javadoc
|
from javadoc
|
||||||
classifier = 'javadoc'
|
archiveClassifier = 'javadoc'
|
||||||
}
|
}
|
||||||
task sourcesJar(type: Jar) {
|
task sourcesJar(type: Jar) {
|
||||||
from sourceSets.main.allSource
|
from sourceSets.main.allSource
|
||||||
classifier = 'sources'
|
archiveClassifier = 'sources'
|
||||||
}
|
}
|
||||||
|
|
||||||
publishing {
|
publishing {
|
||||||
@@ -68,18 +68,14 @@ publishing {
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (project.hasProperty('GITEA_TOKEN') || System.getenv('GITEA_TOKEN') != null) {
|
if ((project.hasProperty('INMONEXUS_USER') || System.getenv('INMONEXUS_USER') != null) && (project.hasProperty('INMONEXUS_PASSWORD') || System.getenv('INMONEXUS_PASSWORD') != null)) {
|
||||||
maven {
|
maven {
|
||||||
name = "Gitea"
|
name = "InmoNexus"
|
||||||
url = uri("https://git.inmo.dev/api/packages/InsanusMokrassar/maven")
|
url = uri("https://nexus.inmo.dev/repository/maven-releases/")
|
||||||
|
|
||||||
credentials(HttpHeaderCredentials) {
|
credentials {
|
||||||
name = "Authorization"
|
username = project.hasProperty('INMONEXUS_USER') ? project.property('INMONEXUS_USER') : System.getenv('INMONEXUS_USER')
|
||||||
value = project.hasProperty('GITEA_TOKEN') ? project.property('GITEA_TOKEN') : System.getenv('GITEA_TOKEN')
|
password = project.hasProperty('INMONEXUS_PASSWORD') ? project.property('INMONEXUS_PASSWORD') : System.getenv('INMONEXUS_PASSWORD')
|
||||||
}
|
|
||||||
|
|
||||||
authentication {
|
|
||||||
header(HttpHeaderAuthentication)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -115,4 +111,27 @@ if (project.hasProperty("signing.gnupg.keyName")) {
|
|||||||
dependsOn(it)
|
dependsOn(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Workaround to make android sign operations depend on signing tasks
|
||||||
|
project.getTasks().withType(AbstractPublishToMaven.class).configureEach {
|
||||||
|
def signingTasks = project.getTasks().withType(Sign.class)
|
||||||
|
mustRunAfter(signingTasks)
|
||||||
|
}
|
||||||
|
// Workaround to make test tasks use sign
|
||||||
|
project.getTasks().withType(Sign.class).configureEach { signTask ->
|
||||||
|
def withoutSign = (signTask.name.startsWith("sign") ? signTask.name.minus("sign") : signTask.name)
|
||||||
|
def pubName = withoutSign.endsWith("Publication") ? withoutSign.substring(0, withoutSign.length() - "Publication".length()) : withoutSign
|
||||||
|
// These tasks only exist for native targets, hence findByName() to avoid trying to find them for other targets
|
||||||
|
|
||||||
|
// Task ':linkDebugTest<platform>' uses this output of task ':sign<platform>Publication' without declaring an explicit or implicit dependency
|
||||||
|
def debugTestTask = tasks.findByName("linkDebugTest$pubName")
|
||||||
|
if (debugTestTask != null) {
|
||||||
|
signTask.mustRunAfter(debugTestTask)
|
||||||
|
}
|
||||||
|
// Task ':compileTestKotlin<platform>' uses this output of task ':sign<platform>Publication' without declaring an explicit or implicit dependency
|
||||||
|
def testTask = tasks.findByName("compileTestKotlin$pubName")
|
||||||
|
if (testTask != null) {
|
||||||
|
signTask.mustRunAfter(testTask)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1 +1 @@
|
|||||||
{"licenses":[{"id":"Apache-2.0","title":"Apache Software License 2.0","url":"https://github.com/InsanusMokrassar/MicroUtils/blob/master/LICENSE"}],"mavenConfig":{"name":"${project.name}","description":"It is set of projects with micro tools for avoiding of routines coding","url":"https://github.com/InsanusMokrassar/MicroUtils/","vcsUrl":"https://github.com/InsanusMokrassar/MicroUtils.git","developers":[{"id":"InsanusMokrassar","name":"Aleksei Ovsiannikov","eMail":"ovsyannikov.alexey95@gmail.com"},{"id":"000Sanya","name":"Syrov Aleksandr","eMail":"000sanya.000sanya@gmail.com"}],"repositories":[{"name":"GithubPackages","url":"https://maven.pkg.github.com/InsanusMokrassar/MicroUtils"},{"name":"Gitea","url":"https://git.inmo.dev/api/packages/InsanusMokrassar/maven","credsType":{"type":"dev.inmo.kmppscriptbuilder.core.models.MavenPublishingRepository.CredentialsType.HttpHeaderCredentials","headerName":"Authorization","headerValueProperty":"GITEA_TOKEN"}},{"name":"sonatype","url":"https://oss.sonatype.org/service/local/staging/deploy/maven2/"}],"gpgSigning":{"type":"dev.inmo.kmppscriptbuilder.core.models.GpgSigning.Optional"}},"type":"JVM"}
|
{"licenses":[{"id":"Apache-2.0","title":"Apache Software License 2.0","url":"https://github.com/InsanusMokrassar/MicroUtils/blob/master/LICENSE"}],"mavenConfig":{"name":"${project.name}","description":"It is set of projects with micro tools for avoiding of routines coding","url":"https://github.com/InsanusMokrassar/MicroUtils/","vcsUrl":"https://github.com/InsanusMokrassar/MicroUtils.git","developers":[{"id":"InsanusMokrassar","name":"Aleksei Ovsiannikov","eMail":"ovsyannikov.alexey95@gmail.com"},{"id":"000Sanya","name":"Syrov Aleksandr","eMail":"000sanya.000sanya@gmail.com"}],"repositories":[{"name":"GithubPackages","url":"https://maven.pkg.github.com/InsanusMokrassar/MicroUtils"},{"name":"InmoNexus","url":"https://nexus.inmo.dev/repository/maven-releases/"},{"name":"sonatype","url":"https://oss.sonatype.org/service/local/staging/deploy/maven2/"}],"gpgSigning":{"type":"dev.inmo.kmppscriptbuilder.core.models.GpgSigning.Optional"}},"type":"JVM"}
|
@@ -15,6 +15,6 @@ dependencies {
|
|||||||
}
|
}
|
||||||
|
|
||||||
java {
|
java {
|
||||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
sourceCompatibility = JavaVersion.VERSION_17
|
||||||
targetCompatibility = JavaVersion.VERSION_1_8
|
targetCompatibility = JavaVersion.VERSION_17
|
||||||
}
|
}
|
||||||
|
@@ -26,6 +26,6 @@ dependencies {
|
|||||||
mainClassName="MainKt"
|
mainClassName="MainKt"
|
||||||
|
|
||||||
java {
|
java {
|
||||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
sourceCompatibility = JavaVersion.VERSION_17
|
||||||
targetCompatibility = JavaVersion.VERSION_1_8
|
targetCompatibility = JavaVersion.VERSION_17
|
||||||
}
|
}
|
||||||
|
@@ -12,9 +12,12 @@ private val json = Json {
|
|||||||
ignoreUnknownKeys = true
|
ignoreUnknownKeys = true
|
||||||
}
|
}
|
||||||
|
|
||||||
private const val baseClassName = "IetfLanguageCode"
|
private const val baseClassName = "IetfLang"
|
||||||
|
private const val oldBaseClassName = "IetfLanguageCode"
|
||||||
private const val unknownBaseClassName = "Unknown$baseClassName"
|
private const val unknownBaseClassName = "Unknown$baseClassName"
|
||||||
private const val baseClassSerializerName = "IetfLanguageCodeSerializer"
|
private const val oldUnknownBaseClassName = "Unknown$oldBaseClassName"
|
||||||
|
private const val baseClassSerializerName = "${baseClassName}Serializer"
|
||||||
|
private const val oldBaseClassSerializerName = "IetfLanguageCodeSerializer"
|
||||||
private const val baseClassSerializerAnnotationName = "@Serializable(${baseClassSerializerName}::class)"
|
private const val baseClassSerializerAnnotationName = "@Serializable(${baseClassSerializerName}::class)"
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
@@ -78,14 +81,12 @@ private fun printLanguageCodeAndTags(
|
|||||||
indents: String = " "
|
indents: String = " "
|
||||||
): String = if (tag.subtags.isEmpty()) {
|
): String = if (tag.subtags.isEmpty()) {
|
||||||
"""${indents}${baseClassSerializerAnnotationName}
|
"""${indents}${baseClassSerializerAnnotationName}
|
||||||
${indents}object ${tag.title} : ${parent ?.title ?: baseClassName}() { override val code: String = "${tag.tag}"; override val withoutDialect: String get() = ${parent ?.title ?.let { "$it.code" } ?: "code"} }"""
|
${indents}object ${tag.title} : ${parent ?.title ?: baseClassName}() { override val code: String = "${tag.tag}"${parent ?.let { parent -> "; override val parentLang: ${parent.title} get() = ${parent.title};" } ?: ""} }"""
|
||||||
} else {
|
} else {
|
||||||
"""
|
"""
|
||||||
${indents}${baseClassSerializerAnnotationName}
|
${indents}${baseClassSerializerAnnotationName}
|
||||||
${indents}sealed class ${tag.title} : ${parent ?.title ?: baseClassName}() {
|
${indents}sealed class ${tag.title} : ${parent ?.title ?: baseClassName}() {
|
||||||
${indents} override val code: String = "${tag.tag}"
|
${indents} override val code: String = "${tag.tag}"${parent ?.let { parent -> "\n${indents} override val parentLang: ${parent.title} get() = ${parent.title};" } ?: ""}
|
||||||
${indents} override val withoutDialect: String
|
|
||||||
${indents} get() = code
|
|
||||||
|
|
||||||
${tag.subtags.joinToString("\n") { printLanguageCodeAndTags(it, tag, "${indents} ") }}
|
${tag.subtags.joinToString("\n") { printLanguageCodeAndTags(it, tag, "${indents} ") }}
|
||||||
|
|
||||||
@@ -95,7 +96,7 @@ ${indents}}
|
|||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
|
|
||||||
fun buildKtFileContent(tags: List<Tag>): String = """
|
fun buildKtFileContent(tags: List<Tag>, prePackage: String): String = """
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -106,20 +107,27 @@ import kotlinx.serialization.Serializable
|
|||||||
${baseClassSerializerAnnotationName}
|
${baseClassSerializerAnnotationName}
|
||||||
sealed class $baseClassName {
|
sealed class $baseClassName {
|
||||||
abstract val code: String
|
abstract val code: String
|
||||||
abstract val withoutDialect: String
|
open val parentLang: $baseClassName?
|
||||||
|
get() = null
|
||||||
|
open val withoutDialect: String
|
||||||
|
get() = parentLang ?.code ?: code
|
||||||
|
|
||||||
${tags.joinToString("\n") { printLanguageCodeAndTags(it, indents = " ") } }
|
${tags.joinToString("\n") { printLanguageCodeAndTags(it, indents = " ") } }
|
||||||
|
|
||||||
$baseClassSerializerAnnotationName
|
$baseClassSerializerAnnotationName
|
||||||
data class $unknownBaseClassName (override val code: String) : $baseClassName() {
|
data class $unknownBaseClassName (override val code: String) : $baseClassName() {
|
||||||
override val withoutDialect: String = code.takeWhile { it != '-' }
|
override val parentLang = code.dropLastWhile { it != '-' }.removeSuffix("-").takeIf { it.length > 0 } ?.let(::$unknownBaseClassName)
|
||||||
}
|
}
|
||||||
|
@Deprecated("Renamed", ReplaceWith("$baseClassName.$unknownBaseClassName", "${if (prePackage.isNotEmpty()) "$prePackage." else ""}$baseClassName.$unknownBaseClassName"))
|
||||||
|
val $oldUnknownBaseClassName = $unknownBaseClassName
|
||||||
|
|
||||||
override fun toString() = code
|
override fun toString() = code
|
||||||
}
|
}
|
||||||
|
@Deprecated("Renamed", ReplaceWith("$baseClassName", "${if (prePackage.isNotEmpty()) "$prePackage." else ""}$baseClassName"))
|
||||||
|
typealias $oldBaseClassName = $baseClassName
|
||||||
""".trimIndent()
|
""".trimIndent()
|
||||||
|
|
||||||
fun createStringConverterCode(tags: List<Tag>): String {
|
fun createStringConverterCode(tags: List<Tag>, prePackage: String): String {
|
||||||
fun createDeserializeVariantForTag(
|
fun createDeserializeVariantForTag(
|
||||||
tag: Tag,
|
tag: Tag,
|
||||||
pretitle: String = baseClassName,
|
pretitle: String = baseClassName,
|
||||||
@@ -128,19 +136,70 @@ fun createStringConverterCode(tags: List<Tag>): String {
|
|||||||
val currentTitle = "$pretitle.${tag.title}"
|
val currentTitle = "$pretitle.${tag.title}"
|
||||||
return """${indents}$currentTitle.code -> $currentTitle${if (tag.subtags.isNotEmpty()) tag.subtags.joinToString("\n", "\n") { createDeserializeVariantForTag(it, currentTitle, indents) } else ""}"""
|
return """${indents}$currentTitle.code -> $currentTitle${if (tag.subtags.isNotEmpty()) tag.subtags.joinToString("\n", "\n") { createDeserializeVariantForTag(it, currentTitle, indents) } else ""}"""
|
||||||
}
|
}
|
||||||
|
fun createInheritorVariantForTag(
|
||||||
return """fun String.as$baseClassName(): $baseClassName {
|
tag: Tag,
|
||||||
return when (this) {
|
pretitle: String = baseClassName,
|
||||||
${tags.joinToString("\n") { createDeserializeVariantForTag(it) }}
|
indents: String = " "
|
||||||
else -> $baseClassName.${unknownBaseClassName}(this)
|
): String {
|
||||||
|
val currentTitle = "$pretitle.${tag.title}"
|
||||||
|
val subtags = if (tag.subtags.isNotEmpty()) {
|
||||||
|
tag.subtags.joinToString(",\n", ",\n") { createInheritorVariantForTag(it, currentTitle, "$indents ") }
|
||||||
|
} else {
|
||||||
|
""
|
||||||
|
}
|
||||||
|
return "${indents}$currentTitle$subtags"
|
||||||
}
|
}
|
||||||
|
fun createInheritorVariantForMapForTag(
|
||||||
|
tag: Tag,
|
||||||
|
pretitle: String = baseClassName,
|
||||||
|
indents: String = " ",
|
||||||
|
codeSuffix: String = ""
|
||||||
|
): String {
|
||||||
|
val currentTitle = "$pretitle.${tag.title}"
|
||||||
|
val subtags = if (tag.subtags.isNotEmpty()) {
|
||||||
|
tag.subtags.joinToString(",\n", ",\n") { createInheritorVariantForMapForTag(it, currentTitle, "$indents ", codeSuffix) }
|
||||||
|
} else {
|
||||||
|
""
|
||||||
|
}
|
||||||
|
return "${indents}$currentTitle.code${codeSuffix} to $currentTitle$subtags"
|
||||||
|
}
|
||||||
|
|
||||||
|
return """val knownLanguageCodesMap: Map<String, $baseClassName> by lazy {
|
||||||
|
mapOf(
|
||||||
|
${tags.joinToString(",\n") { createInheritorVariantForMapForTag(it, indents = " ") }}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
val knownLanguageCodesMapByLowerCasedKeys: Map<String, $baseClassName> by lazy {
|
||||||
|
mapOf(
|
||||||
|
${tags.joinToString(",\n") { createInheritorVariantForMapForTag(it, indents = " ", codeSuffix = ".lowercase()") }}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
val knownLanguageCodes: List<$baseClassName> by lazy {
|
||||||
|
knownLanguageCodesMap.values.toList()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun String.as$baseClassName(): $baseClassName {
|
||||||
|
return knownLanguageCodesMap[this] ?: $baseClassName.${unknownBaseClassName}(this)
|
||||||
|
}
|
||||||
|
fun String.as${baseClassName}CaseInsensitive(): $baseClassName {
|
||||||
|
return knownLanguageCodesMapByLowerCasedKeys[this.lowercase()] ?: $baseClassName.${unknownBaseClassName}(this)
|
||||||
|
}
|
||||||
|
@Deprecated("Renamed", ReplaceWith("this.as$baseClassName()", "${if (prePackage.isNotEmpty()) "$prePackage." else ""}as$baseClassName"))
|
||||||
|
fun String.as$oldBaseClassName(): $baseClassName = as$baseClassName()
|
||||||
|
|
||||||
fun convertTo$baseClassName(code: String) = code.as$baseClassName()
|
fun convertTo$baseClassName(code: String) = code.as$baseClassName()
|
||||||
|
fun convertTo${baseClassName}CaseInsensitive(code: String) = code.as${baseClassName}CaseInsensitive()
|
||||||
|
@Deprecated("Renamed", ReplaceWith("convertTo$baseClassName(code)", "${if (prePackage.isNotEmpty()) "$prePackage." else ""}convertTo$baseClassName"))
|
||||||
|
fun convertTo$oldBaseClassName(code: String) = convertTo$baseClassName(code)
|
||||||
|
|
||||||
fun $baseClassName(code: String) = code.as$baseClassName()
|
fun $baseClassName(code: String) = code.as$baseClassName()
|
||||||
|
fun ${baseClassName}CaseInsensitive(code: String) = code.as${baseClassName}CaseInsensitive()
|
||||||
|
@Deprecated("Renamed", ReplaceWith("$baseClassName(code)", "${if (prePackage.isNotEmpty()) "$prePackage." else ""}$baseClassName"))
|
||||||
|
fun $oldBaseClassName(code: String) = $baseClassName(code)
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createSerializerCode(tags: List<Tag>): String {
|
fun createSerializerCode(tags: List<Tag>, prePackage: String): String {
|
||||||
return """import kotlinx.serialization.KSerializer
|
return """import kotlinx.serialization.KSerializer
|
||||||
import kotlinx.serialization.builtins.serializer
|
import kotlinx.serialization.builtins.serializer
|
||||||
import kotlinx.serialization.encoding.Decoder
|
import kotlinx.serialization.encoding.Decoder
|
||||||
@@ -153,16 +212,20 @@ object $baseClassSerializerName : KSerializer<$baseClassName> {
|
|||||||
return $baseClassName(decoder.decodeString())
|
return $baseClassName(decoder.decodeString())
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun serialize(encoder: Encoder, value: IetfLanguageCode) {
|
override fun serialize(encoder: Encoder, value: $baseClassName) {
|
||||||
encoder.encodeString(value.code)
|
encoder.encodeString(value.code)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@Deprecated("Renamed", ReplaceWith("$baseClassSerializerName", "${if (prePackage.isNotEmpty()) "$prePackage." else ""}$baseClassSerializerName"))
|
||||||
|
typealias $oldBaseClassSerializerName = $baseClassSerializerName
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun main(vararg args: String) {
|
suspend fun main(vararg args: String) {
|
||||||
val outputFolder = args.firstOrNull() ?.let { File(it) }
|
val outputFolder = args.firstOrNull() ?.let { File(it) }
|
||||||
outputFolder ?.mkdirs()
|
outputFolder ?.mkdirs()
|
||||||
|
val targetPackage = args.getOrNull(1)
|
||||||
|
val targetPackagePrefix = targetPackage ?.let { "package $it\n\n" } ?: ""
|
||||||
val ietfLanguageCodesLink = "https://datahub.io/core/language-codes/r/language-codes.json"
|
val ietfLanguageCodesLink = "https://datahub.io/core/language-codes/r/language-codes.json"
|
||||||
val ietfLanguageCodesAdditionalTagsLink = "https://datahub.io/core/language-codes/r/ietf-language-tags.json"
|
val ietfLanguageCodesAdditionalTagsLink = "https://datahub.io/core/language-codes/r/ietf-language-tags.json"
|
||||||
|
|
||||||
@@ -203,18 +266,18 @@ suspend fun main(vararg args: String) {
|
|||||||
File(outputFolder, "LanguageCodes.kt").apply {
|
File(outputFolder, "LanguageCodes.kt").apply {
|
||||||
delete()
|
delete()
|
||||||
createNewFile()
|
createNewFile()
|
||||||
writeText(buildKtFileContent(tags))
|
writeText(targetPackagePrefix + buildKtFileContent(tags, targetPackage ?: ""))
|
||||||
}
|
}
|
||||||
|
|
||||||
File(outputFolder, "StringToLanguageCodes.kt").apply {
|
File(outputFolder, "StringToLanguageCodes.kt").apply {
|
||||||
delete()
|
delete()
|
||||||
createNewFile()
|
createNewFile()
|
||||||
writeText(createStringConverterCode(tags))
|
writeText(targetPackagePrefix + createStringConverterCode(tags, targetPackage ?: ""))
|
||||||
}
|
}
|
||||||
|
|
||||||
File(outputFolder, "$baseClassSerializerName.kt").apply {
|
File(outputFolder, "$baseClassSerializerName.kt").apply {
|
||||||
delete()
|
delete()
|
||||||
createNewFile()
|
createNewFile()
|
||||||
writeText(createSerializerCode(tags))
|
writeText(targetPackagePrefix + createSerializerCode(tags, targetPackage ?: ""))
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -0,0 +1,20 @@
|
|||||||
|
package dev.inmo.micro_utils.language_codes
|
||||||
|
|
||||||
|
import kotlinx.serialization.KSerializer
|
||||||
|
import kotlinx.serialization.builtins.serializer
|
||||||
|
import kotlinx.serialization.encoding.Decoder
|
||||||
|
import kotlinx.serialization.encoding.Encoder
|
||||||
|
|
||||||
|
object IetfLangSerializer : KSerializer<IetfLang> {
|
||||||
|
override val descriptor = String.serializer().descriptor
|
||||||
|
|
||||||
|
override fun deserialize(decoder: Decoder): IetfLang {
|
||||||
|
return IetfLang(decoder.decodeString())
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun serialize(encoder: Encoder, value: IetfLang) {
|
||||||
|
encoder.encodeString(value.code)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@Deprecated("Renamed", ReplaceWith("IetfLangSerializer", "dev.inmo.micro_utils.language_codes.IetfLangSerializer"))
|
||||||
|
typealias IetfLanguageCodeSerializer = IetfLangSerializer
|
@@ -1,18 +0,0 @@
|
|||||||
package dev.inmo.micro_utils.language_codes
|
|
||||||
|
|
||||||
import kotlinx.serialization.KSerializer
|
|
||||||
import kotlinx.serialization.builtins.serializer
|
|
||||||
import kotlinx.serialization.encoding.Decoder
|
|
||||||
import kotlinx.serialization.encoding.Encoder
|
|
||||||
|
|
||||||
object IetfLanguageCodeSerializer : KSerializer<IetfLanguageCode> {
|
|
||||||
override val descriptor = String.serializer().descriptor
|
|
||||||
|
|
||||||
override fun deserialize(decoder: Decoder): IetfLanguageCode {
|
|
||||||
return IetfLanguageCode(decoder.decodeString())
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun serialize(encoder: Encoder, value: IetfLanguageCode) {
|
|
||||||
encoder.encodeString(value.code)
|
|
||||||
}
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,16 @@
|
|||||||
|
package dev.inmo.micro_utils.language_codes
|
||||||
|
|
||||||
|
import kotlin.test.Test
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
class UnknownIetfLanguageTests {
|
||||||
|
@Test
|
||||||
|
fun commonTestOfParentCode() {
|
||||||
|
knownLanguageCodes.forEach {
|
||||||
|
val language = IetfLang.UnknownIetfLang(it.code)
|
||||||
|
assertEquals(it.code, language.code)
|
||||||
|
assertEquals(it.withoutDialect, language.withoutDialect)
|
||||||
|
assertEquals(it.parentLang ?.code, language.parentLang ?.code)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -2,7 +2,9 @@ package dev.inmo.micro_utils.language_codes
|
|||||||
|
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
|
|
||||||
fun IetfLanguageCode.toJavaLocale(): Locale = Locale.forLanguageTag(code)
|
fun IetfLang.toJavaLocale(): Locale = Locale.forLanguageTag(code)
|
||||||
fun IetfLanguageCode?.toJavaLocaleOrDefault(): Locale = this ?.toJavaLocale() ?: Locale.getDefault()
|
fun IetfLang?.toJavaLocaleOrDefault(): Locale = this?.toJavaLocale() ?: Locale.getDefault()
|
||||||
|
|
||||||
fun Locale.toIetfLanguageCode(): IetfLanguageCode = IetfLanguageCode(toLanguageTag())
|
fun Locale.toIetfLang(): IetfLang = IetfLang(toLanguageTag())
|
||||||
|
@Deprecated("Renamed", ReplaceWith("this.toIetfLang()", "dev.inmo.micro_utils.language_codes.toIetfLang"))
|
||||||
|
fun Locale.toIetfLanguageCode(): IetfLang = toIetfLang()
|
||||||
|
@@ -1,12 +1,15 @@
|
|||||||
package dev.inmo.micro_utils.matrix
|
package dev.inmo.micro_utils.matrix
|
||||||
|
|
||||||
class MatrixBuilder<T> {
|
open class MatrixBuilder<T> {
|
||||||
private val mutMatrix: MutableList<List<T>> = ArrayList()
|
private val mutMatrix: MutableList<List<T>> = ArrayList()
|
||||||
val matrix: Matrix<T>
|
val matrix: Matrix<T>
|
||||||
get() = mutMatrix
|
get() = mutMatrix
|
||||||
|
|
||||||
fun row(t: List<T>) = mutMatrix.add(t)
|
fun row(t: List<T>) = mutMatrix.add(t)
|
||||||
|
fun add(t: List<T>) = mutMatrix.add(t)
|
||||||
operator fun List<T>.unaryPlus() = row(this)
|
operator fun List<T>.unaryPlus() = row(this)
|
||||||
|
operator fun plus(t: List<T>) = add(t)
|
||||||
|
operator fun T.unaryPlus() = add(listOf(this))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <T> MatrixBuilder<T>.row(block: RowBuilder<T>.() -> Unit) = +RowBuilder<T>().also(block).row
|
fun <T> MatrixBuilder<T>.row(block: RowBuilder<T>.() -> Unit) = +RowBuilder<T>().also(block).row
|
||||||
|
@@ -1,12 +1,13 @@
|
|||||||
package dev.inmo.micro_utils.matrix
|
package dev.inmo.micro_utils.matrix
|
||||||
|
|
||||||
class RowBuilder<T> {
|
open class RowBuilder<T> {
|
||||||
private val mutRow: MutableList<T> = ArrayList()
|
private val mutRow: MutableList<T> = ArrayList()
|
||||||
val row: Row<T>
|
val row: Row<T>
|
||||||
get() = mutRow
|
get() = mutRow
|
||||||
|
|
||||||
fun column(t: T) = mutRow.add(t)
|
fun add(t: T) = mutRow.add(t)
|
||||||
operator fun T.unaryPlus() = column(this)
|
operator fun T.unaryPlus() = column(this)
|
||||||
|
fun column(t: T) = mutRow.add(t)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <T> row(block: RowBuilder<T>.() -> Unit): List<T> = RowBuilder<T>().also(block).row
|
fun <T> row(block: RowBuilder<T>.() -> Unit): List<T> = RowBuilder<T>().also(block).row
|
||||||
|
@@ -6,6 +6,11 @@ apply from: "$publishGradlePath"
|
|||||||
kotlin {
|
kotlin {
|
||||||
androidTarget {
|
androidTarget {
|
||||||
publishAllLibraryVariants()
|
publishAllLibraryVariants()
|
||||||
|
compilations.all {
|
||||||
|
kotlinOptions {
|
||||||
|
jvmTarget = "17"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
@@ -27,6 +32,6 @@ kotlin {
|
|||||||
apply from: "$defaultAndroidSettingsPresetPath"
|
apply from: "$defaultAndroidSettingsPresetPath"
|
||||||
|
|
||||||
java {
|
java {
|
||||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
sourceCompatibility = JavaVersion.VERSION_17
|
||||||
targetCompatibility = JavaVersion.VERSION_1_8
|
targetCompatibility = JavaVersion.VERSION_17
|
||||||
}
|
}
|
||||||
|
@@ -7,7 +7,7 @@ kotlin {
|
|||||||
jvm {
|
jvm {
|
||||||
compilations.main {
|
compilations.main {
|
||||||
kotlinOptions {
|
kotlinOptions {
|
||||||
jvmTarget = "1.8"
|
jvmTarget = "17"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -35,6 +35,6 @@ kotlin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
java {
|
java {
|
||||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
sourceCompatibility = JavaVersion.VERSION_17
|
||||||
targetCompatibility = JavaVersion.VERSION_1_8
|
targetCompatibility = JavaVersion.VERSION_17
|
||||||
}
|
}
|
||||||
|
@@ -7,7 +7,7 @@ kotlin {
|
|||||||
jvm {
|
jvm {
|
||||||
compilations.main {
|
compilations.main {
|
||||||
kotlinOptions {
|
kotlinOptions {
|
||||||
jvmTarget = "1.8"
|
jvmTarget = "17"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -17,6 +17,11 @@ kotlin {
|
|||||||
}
|
}
|
||||||
androidTarget {
|
androidTarget {
|
||||||
publishAllLibraryVariants()
|
publishAllLibraryVariants()
|
||||||
|
compilations.all {
|
||||||
|
kotlinOptions {
|
||||||
|
jvmTarget = "17"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
linuxX64()
|
linuxX64()
|
||||||
mingwX64()
|
mingwX64()
|
||||||
@@ -61,6 +66,6 @@ kotlin {
|
|||||||
apply from: "$defaultAndroidSettingsPresetPath"
|
apply from: "$defaultAndroidSettingsPresetPath"
|
||||||
|
|
||||||
java {
|
java {
|
||||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
sourceCompatibility = JavaVersion.VERSION_17
|
||||||
targetCompatibility = JavaVersion.VERSION_1_8
|
targetCompatibility = JavaVersion.VERSION_17
|
||||||
}
|
}
|
||||||
|
@@ -7,7 +7,7 @@ kotlin {
|
|||||||
jvm {
|
jvm {
|
||||||
compilations.main {
|
compilations.main {
|
||||||
kotlinOptions {
|
kotlinOptions {
|
||||||
jvmTarget = "1.8"
|
jvmTarget = "17"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -17,6 +17,11 @@ kotlin {
|
|||||||
}
|
}
|
||||||
androidTarget {
|
androidTarget {
|
||||||
publishAllLibraryVariants()
|
publishAllLibraryVariants()
|
||||||
|
compilations.all {
|
||||||
|
kotlinOptions {
|
||||||
|
jvmTarget = "17"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
linuxX64()
|
linuxX64()
|
||||||
mingwX64()
|
mingwX64()
|
||||||
@@ -71,6 +76,6 @@ kotlin {
|
|||||||
apply from: "$defaultAndroidSettingsPresetPath"
|
apply from: "$defaultAndroidSettingsPresetPath"
|
||||||
|
|
||||||
java {
|
java {
|
||||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
sourceCompatibility = JavaVersion.VERSION_17
|
||||||
targetCompatibility = JavaVersion.VERSION_1_8
|
targetCompatibility = JavaVersion.VERSION_17
|
||||||
}
|
}
|
||||||
|
@@ -7,7 +7,7 @@ kotlin {
|
|||||||
jvm {
|
jvm {
|
||||||
compilations.main {
|
compilations.main {
|
||||||
kotlinOptions {
|
kotlinOptions {
|
||||||
jvmTarget = "1.8"
|
jvmTarget = "17"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -49,6 +49,6 @@ kotlin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
java {
|
java {
|
||||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
sourceCompatibility = JavaVersion.VERSION_17
|
||||||
targetCompatibility = JavaVersion.VERSION_1_8
|
targetCompatibility = JavaVersion.VERSION_17
|
||||||
}
|
}
|
||||||
|
@@ -7,7 +7,7 @@ kotlin {
|
|||||||
jvm {
|
jvm {
|
||||||
compilations.main {
|
compilations.main {
|
||||||
kotlinOptions {
|
kotlinOptions {
|
||||||
jvmTarget = "1.8"
|
jvmTarget = "17"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -60,6 +60,6 @@ kotlin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
java {
|
java {
|
||||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
sourceCompatibility = JavaVersion.VERSION_17
|
||||||
targetCompatibility = JavaVersion.VERSION_1_8
|
targetCompatibility = JavaVersion.VERSION_17
|
||||||
}
|
}
|
||||||
|
@@ -7,7 +7,7 @@ kotlin {
|
|||||||
jvm {
|
jvm {
|
||||||
compilations.main {
|
compilations.main {
|
||||||
kotlinOptions {
|
kotlinOptions {
|
||||||
jvmTarget = "1.8"
|
jvmTarget = "17"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -17,6 +17,11 @@ kotlin {
|
|||||||
}
|
}
|
||||||
androidTarget {
|
androidTarget {
|
||||||
publishAllLibraryVariants()
|
publishAllLibraryVariants()
|
||||||
|
compilations.all {
|
||||||
|
kotlinOptions {
|
||||||
|
jvmTarget = "17"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
@@ -70,8 +75,8 @@ kotlin {
|
|||||||
apply from: "$defaultAndroidSettingsPresetPath"
|
apply from: "$defaultAndroidSettingsPresetPath"
|
||||||
|
|
||||||
java {
|
java {
|
||||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
sourceCompatibility = JavaVersion.VERSION_17
|
||||||
targetCompatibility = JavaVersion.VERSION_1_8
|
targetCompatibility = JavaVersion.VERSION_17
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
apply plugin: 'maven-publish'
|
apply plugin: 'maven-publish'
|
||||||
|
|
||||||
task javadocsJar(type: Jar) {
|
task javadocsJar(type: Jar) {
|
||||||
classifier = 'javadoc'
|
archiveClassifier = 'javadoc'
|
||||||
}
|
}
|
||||||
|
|
||||||
publishing {
|
publishing {
|
||||||
@@ -19,29 +19,29 @@ publishing {
|
|||||||
}
|
}
|
||||||
|
|
||||||
developers {
|
developers {
|
||||||
|
|
||||||
developer {
|
developer {
|
||||||
id = "InsanusMokrassar"
|
id = "InsanusMokrassar"
|
||||||
name = "Aleksei Ovsiannikov"
|
name = "Aleksei Ovsiannikov"
|
||||||
email = "ovsyannikov.alexey95@gmail.com"
|
email = "ovsyannikov.alexey95@gmail.com"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
developer {
|
developer {
|
||||||
id = "000Sanya"
|
id = "000Sanya"
|
||||||
name = "Syrov Aleksandr"
|
name = "Syrov Aleksandr"
|
||||||
email = "000sanya.000sanya@gmail.com"
|
email = "000sanya.000sanya@gmail.com"
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
licenses {
|
licenses {
|
||||||
|
|
||||||
license {
|
license {
|
||||||
name = "Apache Software License 2.0"
|
name = "Apache Software License 2.0"
|
||||||
url = "https://github.com/InsanusMokrassar/MicroUtils/blob/master/LICENSE"
|
url = "https://github.com/InsanusMokrassar/MicroUtils/blob/master/LICENSE"
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
repositories {
|
repositories {
|
||||||
@@ -49,57 +49,77 @@ publishing {
|
|||||||
maven {
|
maven {
|
||||||
name = "GithubPackages"
|
name = "GithubPackages"
|
||||||
url = uri("https://maven.pkg.github.com/InsanusMokrassar/MicroUtils")
|
url = uri("https://maven.pkg.github.com/InsanusMokrassar/MicroUtils")
|
||||||
|
|
||||||
credentials {
|
credentials {
|
||||||
username = project.hasProperty('GITHUBPACKAGES_USER') ? project.property('GITHUBPACKAGES_USER') : System.getenv('GITHUBPACKAGES_USER')
|
username = project.hasProperty('GITHUBPACKAGES_USER') ? project.property('GITHUBPACKAGES_USER') : System.getenv('GITHUBPACKAGES_USER')
|
||||||
password = project.hasProperty('GITHUBPACKAGES_PASSWORD') ? project.property('GITHUBPACKAGES_PASSWORD') : System.getenv('GITHUBPACKAGES_PASSWORD')
|
password = project.hasProperty('GITHUBPACKAGES_PASSWORD') ? project.property('GITHUBPACKAGES_PASSWORD') : System.getenv('GITHUBPACKAGES_PASSWORD')
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (project.hasProperty('GITEA_TOKEN') || System.getenv('GITEA_TOKEN') != null) {
|
if ((project.hasProperty('INMONEXUS_USER') || System.getenv('INMONEXUS_USER') != null) && (project.hasProperty('INMONEXUS_PASSWORD') || System.getenv('INMONEXUS_PASSWORD') != null)) {
|
||||||
maven {
|
maven {
|
||||||
name = "Gitea"
|
name = "InmoNexus"
|
||||||
url = uri("https://git.inmo.dev/api/packages/InsanusMokrassar/maven")
|
url = uri("https://nexus.inmo.dev/repository/maven-releases/")
|
||||||
|
|
||||||
credentials(HttpHeaderCredentials) {
|
credentials {
|
||||||
name = "Authorization"
|
username = project.hasProperty('INMONEXUS_USER') ? project.property('INMONEXUS_USER') : System.getenv('INMONEXUS_USER')
|
||||||
value = project.hasProperty('GITEA_TOKEN') ? project.property('GITEA_TOKEN') : System.getenv('GITEA_TOKEN')
|
password = project.hasProperty('INMONEXUS_PASSWORD') ? project.property('INMONEXUS_PASSWORD') : System.getenv('INMONEXUS_PASSWORD')
|
||||||
}
|
|
||||||
|
|
||||||
authentication {
|
|
||||||
header(HttpHeaderAuthentication)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((project.hasProperty('SONATYPE_USER') || System.getenv('SONATYPE_USER') != null) && (project.hasProperty('SONATYPE_PASSWORD') || System.getenv('SONATYPE_PASSWORD') != null)) {
|
if ((project.hasProperty('SONATYPE_USER') || System.getenv('SONATYPE_USER') != null) && (project.hasProperty('SONATYPE_PASSWORD') || System.getenv('SONATYPE_PASSWORD') != null)) {
|
||||||
maven {
|
maven {
|
||||||
name = "sonatype"
|
name = "sonatype"
|
||||||
url = uri("https://oss.sonatype.org/service/local/staging/deploy/maven2/")
|
url = uri("https://oss.sonatype.org/service/local/staging/deploy/maven2/")
|
||||||
|
|
||||||
credentials {
|
credentials {
|
||||||
username = project.hasProperty('SONATYPE_USER') ? project.property('SONATYPE_USER') : System.getenv('SONATYPE_USER')
|
username = project.hasProperty('SONATYPE_USER') ? project.property('SONATYPE_USER') : System.getenv('SONATYPE_USER')
|
||||||
password = project.hasProperty('SONATYPE_PASSWORD') ? project.property('SONATYPE_PASSWORD') : System.getenv('SONATYPE_PASSWORD')
|
password = project.hasProperty('SONATYPE_PASSWORD') ? project.property('SONATYPE_PASSWORD') : System.getenv('SONATYPE_PASSWORD')
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (project.hasProperty("signing.gnupg.keyName")) {
|
if (project.hasProperty("signing.gnupg.keyName")) {
|
||||||
apply plugin: 'signing'
|
apply plugin: 'signing'
|
||||||
|
|
||||||
signing {
|
signing {
|
||||||
useGpgCmd()
|
useGpgCmd()
|
||||||
|
|
||||||
sign publishing.publications
|
sign publishing.publications
|
||||||
}
|
}
|
||||||
|
|
||||||
task signAll {
|
task signAll {
|
||||||
tasks.withType(Sign).forEach {
|
tasks.withType(Sign).forEach {
|
||||||
dependsOn(it)
|
dependsOn(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Workaround to make android sign operations depend on signing tasks
|
||||||
|
project.getTasks().withType(AbstractPublishToMaven.class).configureEach {
|
||||||
|
def signingTasks = project.getTasks().withType(Sign.class)
|
||||||
|
mustRunAfter(signingTasks)
|
||||||
|
}
|
||||||
|
// Workaround to make test tasks use sign
|
||||||
|
project.getTasks().withType(Sign.class).configureEach { signTask ->
|
||||||
|
def withoutSign = (signTask.name.startsWith("sign") ? signTask.name.minus("sign") : signTask.name)
|
||||||
|
def pubName = withoutSign.endsWith("Publication") ? withoutSign.substring(0, withoutSign.length() - "Publication".length()) : withoutSign
|
||||||
|
// These tasks only exist for native targets, hence findByName() to avoid trying to find them for other targets
|
||||||
|
|
||||||
|
// Task ':linkDebugTest<platform>' uses this output of task ':sign<platform>Publication' without declaring an explicit or implicit dependency
|
||||||
|
def debugTestTask = tasks.findByName("linkDebugTest$pubName")
|
||||||
|
if (debugTestTask != null) {
|
||||||
|
signTask.mustRunAfter(debugTestTask)
|
||||||
|
}
|
||||||
|
// Task ':compileTestKotlin<platform>' uses this output of task ':sign<platform>Publication' without declaring an explicit or implicit dependency
|
||||||
|
def testTask = tasks.findByName("compileTestKotlin$pubName")
|
||||||
|
if (testTask != null) {
|
||||||
|
signTask.mustRunAfter(testTask)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1 +1 @@
|
|||||||
{"licenses":[{"id":"Apache-2.0","title":"Apache Software License 2.0","url":"https://github.com/InsanusMokrassar/MicroUtils/blob/master/LICENSE"}],"mavenConfig":{"name":"${project.name}","description":"It is set of projects with micro tools for avoiding of routines coding","url":"https://github.com/InsanusMokrassar/MicroUtils/","vcsUrl":"https://github.com/InsanusMokrassar/MicroUtils.git","developers":[{"id":"InsanusMokrassar","name":"Aleksei Ovsiannikov","eMail":"ovsyannikov.alexey95@gmail.com"},{"id":"000Sanya","name":"Syrov Aleksandr","eMail":"000sanya.000sanya@gmail.com"}],"repositories":[{"name":"GithubPackages","url":"https://maven.pkg.github.com/InsanusMokrassar/MicroUtils"},{"name":"Gitea","url":"https://git.inmo.dev/api/packages/InsanusMokrassar/maven","credsType":{"type":"dev.inmo.kmppscriptbuilder.core.models.MavenPublishingRepository.CredentialsType.HttpHeaderCredentials","headerName":"Authorization","headerValueProperty":"GITEA_TOKEN"}},{"name":"sonatype","url":"https://oss.sonatype.org/service/local/staging/deploy/maven2/"}],"gpgSigning":{"type":"dev.inmo.kmppscriptbuilder.core.models.GpgSigning.Optional"}}}
|
{"licenses":[{"id":"Apache-2.0","title":"Apache Software License 2.0","url":"https://github.com/InsanusMokrassar/MicroUtils/blob/master/LICENSE"}],"mavenConfig":{"name":"${project.name}","description":"It is set of projects with micro tools for avoiding of routines coding","url":"https://github.com/InsanusMokrassar/MicroUtils/","vcsUrl":"https://github.com/InsanusMokrassar/MicroUtils.git","developers":[{"id":"InsanusMokrassar","name":"Aleksei Ovsiannikov","eMail":"ovsyannikov.alexey95@gmail.com"},{"id":"000Sanya","name":"Syrov Aleksandr","eMail":"000sanya.000sanya@gmail.com"}],"repositories":[{"name":"GithubPackages","url":"https://maven.pkg.github.com/InsanusMokrassar/MicroUtils"},{"name":"InmoNexus","url":"https://nexus.inmo.dev/repository/maven-releases/"},{"name":"sonatype","url":"https://oss.sonatype.org/service/local/staging/deploy/maven2/"}],"gpgSigning":{"type":"dev.inmo.kmppscriptbuilder.core.models.GpgSigning.Optional"}}}
|
@@ -1,14 +1,19 @@
|
|||||||
package dev.inmo.micro_utils.repos.exposed
|
package dev.inmo.micro_utils.repos.exposed
|
||||||
|
|
||||||
import dev.inmo.micro_utils.repos.CRUDRepo
|
import dev.inmo.micro_utils.repos.CRUDRepo
|
||||||
|
import kotlinx.coroutines.channels.BufferOverflow
|
||||||
|
|
||||||
abstract class AbstractExposedCRUDRepo<ObjectType, IdType, InputValueType>(
|
abstract class AbstractExposedCRUDRepo<ObjectType, IdType, InputValueType>(
|
||||||
flowsChannelsSize: Int = 0,
|
flowsChannelsSize: Int = 0,
|
||||||
tableName: String = ""
|
tableName: String = "",
|
||||||
|
replyCacheInFlows: Int = 0,
|
||||||
|
onBufferOverflowBehaviour: BufferOverflow = BufferOverflow.SUSPEND
|
||||||
) :
|
) :
|
||||||
AbstractExposedWriteCRUDRepo<ObjectType, IdType, InputValueType>(
|
AbstractExposedWriteCRUDRepo<ObjectType, IdType, InputValueType>(
|
||||||
flowsChannelsSize,
|
flowsChannelsSize,
|
||||||
tableName
|
tableName,
|
||||||
|
replyCacheInFlows,
|
||||||
|
onBufferOverflowBehaviour
|
||||||
),
|
),
|
||||||
ExposedCRUDRepo<ObjectType, IdType>,
|
ExposedCRUDRepo<ObjectType, IdType>,
|
||||||
CRUDRepo<ObjectType, IdType, InputValueType>
|
CRUDRepo<ObjectType, IdType, InputValueType>
|
||||||
|
@@ -2,6 +2,7 @@ package dev.inmo.micro_utils.repos.exposed
|
|||||||
|
|
||||||
import dev.inmo.micro_utils.repos.UpdatedValuePair
|
import dev.inmo.micro_utils.repos.UpdatedValuePair
|
||||||
import dev.inmo.micro_utils.repos.WriteCRUDRepo
|
import dev.inmo.micro_utils.repos.WriteCRUDRepo
|
||||||
|
import kotlinx.coroutines.channels.BufferOverflow
|
||||||
import kotlinx.coroutines.flow.*
|
import kotlinx.coroutines.flow.*
|
||||||
import org.jetbrains.exposed.sql.*
|
import org.jetbrains.exposed.sql.*
|
||||||
import org.jetbrains.exposed.sql.statements.*
|
import org.jetbrains.exposed.sql.statements.*
|
||||||
@@ -11,19 +12,26 @@ import java.util.Objects
|
|||||||
abstract class AbstractExposedWriteCRUDRepo<ObjectType, IdType, InputValueType>(
|
abstract class AbstractExposedWriteCRUDRepo<ObjectType, IdType, InputValueType>(
|
||||||
flowsChannelsSize: Int = 0,
|
flowsChannelsSize: Int = 0,
|
||||||
tableName: String = "",
|
tableName: String = "",
|
||||||
replyCacheInFlows: Int = 0
|
replyCacheInFlows: Int = 0,
|
||||||
|
onBufferOverflowBehaviour: BufferOverflow = BufferOverflow.SUSPEND
|
||||||
) :
|
) :
|
||||||
AbstractExposedReadCRUDRepo<ObjectType, IdType>(tableName),
|
AbstractExposedReadCRUDRepo<ObjectType, IdType>(tableName),
|
||||||
ExposedCRUDRepo<ObjectType, IdType>,
|
ExposedCRUDRepo<ObjectType, IdType>,
|
||||||
WriteCRUDRepo<ObjectType, IdType, InputValueType>
|
WriteCRUDRepo<ObjectType, IdType, InputValueType>
|
||||||
{
|
{
|
||||||
protected val _newObjectsFlow = MutableSharedFlow<ObjectType>(replyCacheInFlows, flowsChannelsSize)
|
protected open val _newObjectsFlow = MutableSharedFlow<ObjectType>(replyCacheInFlows, flowsChannelsSize, onBufferOverflowBehaviour)
|
||||||
protected val _updatedObjectsFlow = MutableSharedFlow<ObjectType>(replyCacheInFlows, flowsChannelsSize)
|
protected open val _updatedObjectsFlow = MutableSharedFlow<ObjectType>(replyCacheInFlows, flowsChannelsSize, onBufferOverflowBehaviour)
|
||||||
protected val _deletedObjectsIdsFlow = MutableSharedFlow<IdType>(replyCacheInFlows, flowsChannelsSize)
|
protected open val _deletedObjectsIdsFlow = MutableSharedFlow<IdType>(replyCacheInFlows, flowsChannelsSize, onBufferOverflowBehaviour)
|
||||||
|
|
||||||
override val newObjectsFlow: Flow<ObjectType> = _newObjectsFlow.asSharedFlow()
|
override val newObjectsFlow: Flow<ObjectType> by lazy {
|
||||||
override val updatedObjectsFlow: Flow<ObjectType> = _updatedObjectsFlow.asSharedFlow()
|
_newObjectsFlow.asSharedFlow()
|
||||||
override val deletedObjectsIdsFlow: Flow<IdType> = _deletedObjectsIdsFlow.asSharedFlow()
|
}
|
||||||
|
override val updatedObjectsFlow: Flow<ObjectType> by lazy {
|
||||||
|
_updatedObjectsFlow.asSharedFlow()
|
||||||
|
}
|
||||||
|
override val deletedObjectsIdsFlow: Flow<IdType> by lazy {
|
||||||
|
_deletedObjectsIdsFlow.asSharedFlow()
|
||||||
|
}
|
||||||
|
|
||||||
protected abstract fun InsertStatement<Number>.asObject(value: InputValueType): ObjectType
|
protected abstract fun InsertStatement<Number>.asObject(value: InputValueType): ObjectType
|
||||||
|
|
||||||
|
@@ -16,6 +16,6 @@ dependencies {
|
|||||||
}
|
}
|
||||||
|
|
||||||
java {
|
java {
|
||||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
sourceCompatibility = JavaVersion.VERSION_17
|
||||||
targetCompatibility = JavaVersion.VERSION_1_8
|
targetCompatibility = JavaVersion.VERSION_17
|
||||||
}
|
}
|
||||||
|
21
resources/build.gradle
Normal file
21
resources/build.gradle
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
plugins {
|
||||||
|
id "org.jetbrains.kotlin.multiplatform"
|
||||||
|
id "org.jetbrains.kotlin.plugin.serialization"
|
||||||
|
id "com.android.library"
|
||||||
|
}
|
||||||
|
|
||||||
|
apply from: "$mppJvmJsAndroidLinuxMingwLinuxArm64ProjectPresetPath"
|
||||||
|
|
||||||
|
kotlin {
|
||||||
|
sourceSets {
|
||||||
|
commonMain {
|
||||||
|
dependencies {
|
||||||
|
api project(":micro_utils.language_codes")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
androidMain {
|
||||||
|
dependsOn(jvmMain)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,20 @@
|
|||||||
|
package dev.inmo.micro_utils.strings
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.res.Configuration
|
||||||
|
import android.content.res.Resources
|
||||||
|
import android.os.Build
|
||||||
|
|
||||||
|
fun StringResource.translation(configuration: Configuration): String = translation(
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||||
|
configuration.locales[0]
|
||||||
|
} else {
|
||||||
|
configuration.locale
|
||||||
|
}
|
||||||
|
)
|
||||||
|
fun StringResource.translation(resources: Resources): String = translation(resources.configuration)
|
||||||
|
fun StringResource.translation(context: Context): String = translation(context.resources)
|
||||||
|
|
||||||
|
fun Configuration.translation(resource: StringResource): String = resource.translation(this)
|
||||||
|
fun Resources.translation(resource: StringResource): String = configuration.translation(resource)
|
||||||
|
fun Context.translation(resource: StringResource): String = resources.translation(resource)
|
56
resources/src/commonMain/kotlin/StringResource.kt
Normal file
56
resources/src/commonMain/kotlin/StringResource.kt
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
package dev.inmo.micro_utils.strings
|
||||||
|
|
||||||
|
import dev.inmo.micro_utils.language_codes.IetfLang
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use this class as a type of your strings object fields. For example:
|
||||||
|
*
|
||||||
|
* ```kotlin
|
||||||
|
* object Strings {
|
||||||
|
* val someResource: StringResource
|
||||||
|
* }
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* Use [buildStringResource] for useful creation of string resource
|
||||||
|
*
|
||||||
|
* @see buildStringResource
|
||||||
|
*/
|
||||||
|
class StringResource(
|
||||||
|
val default: String,
|
||||||
|
val map: Map<IetfLang, Lazy<String>>
|
||||||
|
) {
|
||||||
|
class Builder(
|
||||||
|
var default: String
|
||||||
|
) {
|
||||||
|
private val map = mutableMapOf<IetfLang, Lazy<String>>()
|
||||||
|
|
||||||
|
infix fun IetfLang.variant(value: Lazy<String>) {
|
||||||
|
map[this] = value
|
||||||
|
}
|
||||||
|
|
||||||
|
infix fun IetfLang.variant(value: () -> String) = this variant lazy(value)
|
||||||
|
infix fun IetfLang.variant(value: String) = this variant lazyOf(value)
|
||||||
|
|
||||||
|
|
||||||
|
infix fun String.variant(value: Lazy<String>) = IetfLang(this) variant value
|
||||||
|
infix fun String.variant(value: () -> String) = IetfLang(this) variant lazy(value)
|
||||||
|
infix fun String.variant(value: String) = this variant lazyOf(value)
|
||||||
|
|
||||||
|
fun build() = StringResource(default, map.toMap())
|
||||||
|
}
|
||||||
|
|
||||||
|
fun translation(languageCode: IetfLang): String {
|
||||||
|
map[languageCode] ?.let { return it.value }
|
||||||
|
|
||||||
|
return languageCode.parentLang ?.let {
|
||||||
|
map[it] ?.value
|
||||||
|
} ?: default
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun buildStringResource(
|
||||||
|
default: String,
|
||||||
|
builder: StringResource.Builder.() -> Unit
|
||||||
|
): StringResource {
|
||||||
|
return StringResource.Builder(default).apply(builder).build()
|
||||||
|
}
|
10
resources/src/jvmMain/kotlin/StringResourceLocaleGetter.kt
Normal file
10
resources/src/jvmMain/kotlin/StringResourceLocaleGetter.kt
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
package dev.inmo.micro_utils.strings
|
||||||
|
|
||||||
|
import dev.inmo.micro_utils.language_codes.toIetfLang
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
fun StringResource.translation(locale: Locale = Locale.getDefault()): String {
|
||||||
|
return translation(locale.toIetfLang())
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Locale.translation(resource: StringResource): String = resource.translation(this)
|
@@ -16,11 +16,16 @@ import kotlinx.serialization.encoding.Encoder
|
|||||||
*/
|
*/
|
||||||
open class MapperDeserializationStrategy<I, O>(
|
open class MapperDeserializationStrategy<I, O>(
|
||||||
private val base: DeserializationStrategy<I>,
|
private val base: DeserializationStrategy<I>,
|
||||||
private val deserialize: (I) -> O
|
private val deserialize: (Decoder, I) -> O
|
||||||
) : DeserializationStrategy<O> {
|
) : DeserializationStrategy<O> {
|
||||||
override val descriptor: SerialDescriptor = base.descriptor
|
override val descriptor: SerialDescriptor = base.descriptor
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
base: DeserializationStrategy<I>,
|
||||||
|
deserialize: (I) -> O
|
||||||
|
) : this(base, { _, i -> deserialize(i) })
|
||||||
|
|
||||||
override fun deserialize(decoder: Decoder): O {
|
override fun deserialize(decoder: Decoder): O {
|
||||||
return deserialize(base.deserialize(decoder))
|
return deserialize(decoder, base.deserialize(decoder))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,9 +1,7 @@
|
|||||||
package dev.inmo.micro_utils.serialization.mapper
|
package dev.inmo.micro_utils.serialization.mapper
|
||||||
|
|
||||||
import kotlinx.serialization.KSerializer
|
|
||||||
import kotlinx.serialization.SerializationStrategy
|
import kotlinx.serialization.SerializationStrategy
|
||||||
import kotlinx.serialization.descriptors.SerialDescriptor
|
import kotlinx.serialization.descriptors.SerialDescriptor
|
||||||
import kotlinx.serialization.encoding.Decoder
|
|
||||||
import kotlinx.serialization.encoding.Encoder
|
import kotlinx.serialization.encoding.Encoder
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -11,15 +9,20 @@ import kotlinx.serialization.encoding.Encoder
|
|||||||
* serialization
|
* serialization
|
||||||
*
|
*
|
||||||
* @param base Serializer for [I]
|
* @param base Serializer for [I]
|
||||||
* @param serialize Will be used in [serialize] method to convert incoming [O] to [I] and serialize with [base]
|
* @param internalSerialize Will be used in [internalSerialize] method to convert incoming [O] to [I] and serialize with [base]
|
||||||
*/
|
*/
|
||||||
open class MapperSerializationStrategy<I, O>(
|
open class MapperSerializationStrategy<I, O>(
|
||||||
private val base: SerializationStrategy<I>,
|
private val base: SerializationStrategy<I>,
|
||||||
private val serialize: (O) -> I
|
private val internalSerialize: (Encoder, O) -> I
|
||||||
) : SerializationStrategy<O> {
|
) : SerializationStrategy<O> {
|
||||||
override val descriptor: SerialDescriptor = base.descriptor
|
override val descriptor: SerialDescriptor = base.descriptor
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
base: SerializationStrategy<I>,
|
||||||
|
serialize: (O) -> I
|
||||||
|
) : this(base, { _, o -> serialize(o) })
|
||||||
|
|
||||||
override fun serialize(encoder: Encoder, value: O) {
|
override fun serialize(encoder: Encoder, value: O) {
|
||||||
base.serialize(encoder, serialize(value))
|
base.serialize(encoder, internalSerialize(encoder, value))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,8 @@
|
|||||||
package dev.inmo.micro_utils.serialization.mapper
|
package dev.inmo.micro_utils.serialization.mapper
|
||||||
|
|
||||||
|
import kotlinx.serialization.DeserializationStrategy
|
||||||
import kotlinx.serialization.KSerializer
|
import kotlinx.serialization.KSerializer
|
||||||
|
import kotlinx.serialization.SerializationStrategy
|
||||||
import kotlinx.serialization.descriptors.SerialDescriptor
|
import kotlinx.serialization.descriptors.SerialDescriptor
|
||||||
import kotlinx.serialization.encoding.Decoder
|
import kotlinx.serialization.encoding.Decoder
|
||||||
import kotlinx.serialization.encoding.Encoder
|
import kotlinx.serialization.encoding.Encoder
|
||||||
@@ -15,16 +17,28 @@ import kotlinx.serialization.encoding.Encoder
|
|||||||
*/
|
*/
|
||||||
open class MapperSerializer<I, O>(
|
open class MapperSerializer<I, O>(
|
||||||
private val base: KSerializer<I>,
|
private val base: KSerializer<I>,
|
||||||
private val serialize: (O) -> I,
|
private val serialize: (Encoder, O) -> I,
|
||||||
private val deserialize: (I) -> O
|
private val deserialize: (Decoder, I) -> O
|
||||||
) : KSerializer<O> {
|
) : KSerializer<O>,
|
||||||
|
DeserializationStrategy<O> by MapperDeserializationStrategy<I, O>(base, deserialize),
|
||||||
|
SerializationStrategy<O> by MapperSerializationStrategy<I, O>(base, serialize) {
|
||||||
override val descriptor: SerialDescriptor = base.descriptor
|
override val descriptor: SerialDescriptor = base.descriptor
|
||||||
|
|
||||||
override fun deserialize(decoder: Decoder): O {
|
constructor(
|
||||||
return deserialize(base.deserialize(decoder))
|
base: KSerializer<I>,
|
||||||
}
|
serialize: (O) -> I,
|
||||||
|
deserialize: (I) -> O
|
||||||
|
) : this(base, { _, o -> serialize(o) }, { _, i -> deserialize(i) })
|
||||||
|
|
||||||
override fun serialize(encoder: Encoder, value: O) {
|
constructor(
|
||||||
base.serialize(encoder, serialize(value))
|
base: KSerializer<I>,
|
||||||
}
|
serialize: (Encoder, O) -> I,
|
||||||
|
deserialize: (I) -> O
|
||||||
|
) : this(base, serialize, { _, i -> deserialize(i) })
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
base: KSerializer<I>,
|
||||||
|
serialize: (O) -> I,
|
||||||
|
deserialize: (Decoder, I) -> O
|
||||||
|
) : this(base, { _, o -> serialize(o) }, deserialize)
|
||||||
}
|
}
|
||||||
|
@@ -43,6 +43,8 @@ String[] includes = [
|
|||||||
":startup:plugin",
|
":startup:plugin",
|
||||||
":startup:launcher",
|
":startup:launcher",
|
||||||
|
|
||||||
|
":resources",
|
||||||
|
|
||||||
":fsm:common",
|
":fsm:common",
|
||||||
":fsm:repos:common",
|
":fsm:repos:common",
|
||||||
|
|
||||||
@@ -59,5 +61,3 @@ includes.each { originalName ->
|
|||||||
project.name = projectName
|
project.name = projectName
|
||||||
project.projectDir = new File(projectDirectory)
|
project.projectDir = new File(projectDirectory)
|
||||||
}
|
}
|
||||||
|
|
||||||
enableFeaturePreview("VERSION_CATALOGS")
|
|
||||||
|
@@ -28,8 +28,8 @@ application {
|
|||||||
}
|
}
|
||||||
|
|
||||||
java {
|
java {
|
||||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
sourceCompatibility = JavaVersion.VERSION_17
|
||||||
targetCompatibility = JavaVersion.VERSION_1_8
|
targetCompatibility = JavaVersion.VERSION_17
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
Reference in New Issue
Block a user