From 5e4065ee531220e7fffb46f9146ea6c363fbdd5e Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Mon, 13 Jan 2020 09:29:35 +0600 Subject: [PATCH 1/5] start 0.2.1 --- CHANGELOG.md | 2 ++ build.gradle | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4eed8f3..fe02d12 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,3 +6,5 @@ * Updates in libraries: * Coroutines `1.3.2` -> `1.3.3` * Klock `1.7.3` -> `1.8.6` + +## 0.2.1 diff --git a/build.gradle b/build.gradle index 0aa107a..42e081f 100644 --- a/build.gradle +++ b/build.gradle @@ -17,7 +17,7 @@ plugins { id "org.jetbrains.kotlin.plugin.serialization" version "$kotlin_version" } -project.version = "0.2.0" +project.version = "0.2.1" project.group = "com.insanusmokrassar" apply from: "publish.gradle" From 1d202a7311bc6cdca92356c70f64b857b641956a Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Mon, 13 Jan 2020 10:15:01 +0600 Subject: [PATCH 2/5] asFlow extension --- CHANGELOG.md | 2 ++ build.gradle | 1 + .../krontab/utils/SchedulerFlow.kt | 25 ++++++++++++++ .../insanusmokrassar/krontab/utils/RunTest.kt | 8 +++++ .../krontab/utils/SchedulerFlow.kt | 34 +++++++++++++++++++ .../insanusmokrassar/krontab/utils/RunTest.kt | 5 +++ .../insanusmokrassar/krontab/utils/RunTest.kt | 9 +++++ 7 files changed, 84 insertions(+) create mode 100644 src/commonMain/kotlin/com/insanusmokrassar/krontab/utils/SchedulerFlow.kt create mode 100644 src/commonTest/kotlin/com/insanusmokrassar/krontab/utils/RunTest.kt create mode 100644 src/commonTest/kotlin/com/insanusmokrassar/krontab/utils/SchedulerFlow.kt create mode 100644 src/jsTest/kotlin/com/insanusmokrassar/krontab/utils/RunTest.kt create mode 100644 src/jvmTest/kotlin/com/insanusmokrassar/krontab/utils/RunTest.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index fe02d12..8dc3acf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,3 +8,5 @@ * Klock `1.7.3` -> `1.8.6` ## 0.2.1 + +* Added support of flows: now any `KronScheduler` can be convert to `Flow` using `asFlow` extension diff --git a/build.gradle b/build.gradle index 42e081f..1edeb16 100644 --- a/build.gradle +++ b/build.gradle @@ -47,6 +47,7 @@ kotlin { implementation kotlin('test-common') implementation kotlin('test-annotations-common') implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines_version" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$kotlin_coroutines_version" } } jvmMain { diff --git a/src/commonMain/kotlin/com/insanusmokrassar/krontab/utils/SchedulerFlow.kt b/src/commonMain/kotlin/com/insanusmokrassar/krontab/utils/SchedulerFlow.kt new file mode 100644 index 0000000..bf0c0f8 --- /dev/null +++ b/src/commonMain/kotlin/com/insanusmokrassar/krontab/utils/SchedulerFlow.kt @@ -0,0 +1,25 @@ +package com.insanusmokrassar.krontab.utils + +import com.insanusmokrassar.krontab.KronScheduler +import com.soywiz.klock.DateTime +import kotlinx.coroutines.* +import kotlinx.coroutines.flow.* + +@FlowPreview +fun KronScheduler.asFlow(): Flow = SchedulerFlow(this) + +@FlowPreview +class SchedulerFlow( + private val scheduler: KronScheduler +) : AbstractFlow() { + @FlowPreview + override suspend fun collectSafely(collector: FlowCollector) { + while (true) { + val now = DateTime.now() + val nextTime = scheduler.next(now) + val sleepDelay = (nextTime - now).millisecondsLong + delay(sleepDelay) + collector.emit(nextTime) + } + } +} \ No newline at end of file diff --git a/src/commonTest/kotlin/com/insanusmokrassar/krontab/utils/RunTest.kt b/src/commonTest/kotlin/com/insanusmokrassar/krontab/utils/RunTest.kt new file mode 100644 index 0000000..129a4b5 --- /dev/null +++ b/src/commonTest/kotlin/com/insanusmokrassar/krontab/utils/RunTest.kt @@ -0,0 +1,8 @@ +package com.insanusmokrassar.krontab.utils + +import kotlinx.coroutines.CoroutineScope + +/** + * Workaround to use suspending functions in unit tests + */ +expect fun runTest(block: suspend (scope : CoroutineScope) -> Unit) diff --git a/src/commonTest/kotlin/com/insanusmokrassar/krontab/utils/SchedulerFlow.kt b/src/commonTest/kotlin/com/insanusmokrassar/krontab/utils/SchedulerFlow.kt new file mode 100644 index 0000000..29eca3b --- /dev/null +++ b/src/commonTest/kotlin/com/insanusmokrassar/krontab/utils/SchedulerFlow.kt @@ -0,0 +1,34 @@ +package com.insanusmokrassar.krontab.utils + +import com.insanusmokrassar.krontab.builder.buildSchedule +import kotlinx.coroutines.* +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.takeWhile +import kotlin.test.Test +import kotlin.test.assertEquals + +@ExperimentalCoroutinesApi +@FlowPreview +class SchedulerFlowTests { + @Test + fun testThatFlowIsCorrectlyWorkEverySecond() { + val kronScheduler = buildSchedule { + seconds { + 0 every 1 + } + } + + val flow = kronScheduler.asFlow() + + runTest { + val mustBeCollected = 10 + var collected = 0 + flow.takeWhile { + collected < mustBeCollected + }.collect { + collected++ + } + assertEquals(mustBeCollected, collected) + } + } +} diff --git a/src/jsTest/kotlin/com/insanusmokrassar/krontab/utils/RunTest.kt b/src/jsTest/kotlin/com/insanusmokrassar/krontab/utils/RunTest.kt new file mode 100644 index 0000000..5d87632 --- /dev/null +++ b/src/jsTest/kotlin/com/insanusmokrassar/krontab/utils/RunTest.kt @@ -0,0 +1,5 @@ +package com.insanusmokrassar.krontab.utils + +import kotlinx.coroutines.* + +actual fun runTest(block: suspend (scope : CoroutineScope) -> Unit): dynamic = GlobalScope.promise { block(this) } diff --git a/src/jvmTest/kotlin/com/insanusmokrassar/krontab/utils/RunTest.kt b/src/jvmTest/kotlin/com/insanusmokrassar/krontab/utils/RunTest.kt new file mode 100644 index 0000000..a20cefc --- /dev/null +++ b/src/jvmTest/kotlin/com/insanusmokrassar/krontab/utils/RunTest.kt @@ -0,0 +1,9 @@ +package com.insanusmokrassar.krontab.utils + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.runBlocking + +/** + * Workaround to use suspending functions in unit tests + */ +actual fun runTest(block: suspend (scope: CoroutineScope) -> Unit) = runBlocking(block = block) From 1678b637a6cec1176d795d96483e7caf562a506d Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Mon, 13 Jan 2020 10:34:35 +0600 Subject: [PATCH 3/5] fillup readme with asFlow info and add one more test --- README.md | 26 ++++++++++++++ .../insanusmokrassar/krontab/utils/FailJob.kt | 8 +++++ .../krontab/utils/SchedulerFlow.kt | 35 +++++++++++++++++++ 3 files changed, 69 insertions(+) create mode 100644 src/commonTest/kotlin/com/insanusmokrassar/krontab/utils/FailJob.kt diff --git a/README.md b/README.md index ec1b0ba..1852a64 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ runtime of applications. | [ How to use: Including in project ](#including-in-project) | | [ How to use: Config from string ](#config-from-string) | | [ How to use: Config via builder (DSL preview) ](#config-via-builder) | +| [ How to use: KronScheduler as a Flow ](#KronScheduler-as-a-Flow) | ## How to use @@ -124,3 +125,28 @@ kronScheduler.doInfinity { ``` All of these examples will do the same things: print `Called` message every five seconds. + +### KronScheduler as a Flow + +Any `KronScheduler`can e converted to a `Flow + it.async { + var collected = 0 + flow.takeWhile { + collected < mustBeCollected + }.collect { + collected++ + } + collected + } + }.awaitAll() + + failJob.cancel() + + answers.forEach { + assertEquals(mustBeCollected, it) + } + } + } } From 5c4d3814f664b45fc4f87098eac10e76187100cf Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Mon, 13 Jan 2020 11:15:14 +0600 Subject: [PATCH 4/5] update publication script --- publish.gradle | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/publish.gradle b/publish.gradle index 24f0da8..477fed9 100644 --- a/publish.gradle +++ b/publish.gradle @@ -2,9 +2,19 @@ apply plugin: 'com.jfrog.bintray' apply from: "maven.publish.gradle" +ext { + projectBintrayDir = "${project.group}/".replace(".", "/") + "${project.name}/${project.version}" +} + bintray { user = project.hasProperty('BINTRAY_USER') ? project.property('BINTRAY_USER') : System.getenv('BINTRAY_USER') key = project.hasProperty('BINTRAY_KEY') ? project.property('BINTRAY_KEY') : System.getenv('BINTRAY_KEY') + filesSpec { + from "${buildDir}/publications/kotlinMultiplatform/" + include "module.json" + rename "module\\.json", "${project.name}-${project.version}.module" + into "${projectBintrayDir}" + } pkg { repo = "InsanusMokrassar" name = "${project.name}" From 291c2110635d2c17a78d4397fca3d541a326ba5b Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Mon, 13 Jan 2020 22:00:58 +0600 Subject: [PATCH 5/5] update publish script --- publish.gradle | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/publish.gradle b/publish.gradle index 477fed9..23bd45f 100644 --- a/publish.gradle +++ b/publish.gradle @@ -10,10 +10,21 @@ bintray { user = project.hasProperty('BINTRAY_USER') ? project.property('BINTRAY_USER') : System.getenv('BINTRAY_USER') key = project.hasProperty('BINTRAY_KEY') ? project.property('BINTRAY_KEY') : System.getenv('BINTRAY_KEY') filesSpec { - from "${buildDir}/publications/kotlinMultiplatform/" - include "module.json" - rename "module\\.json", "${project.name}-${project.version}.module" - into "${projectBintrayDir}" + from "${buildDir}/publications/" + eachFile { + if (it.getName() == "module.json") { + File file = it.getFile() + String directorySubname = file.parentFile.name + if (directorySubname == "kotlinMultiplatform") { + it.setPath("${project.name}/${project.version}/${project.name}-${project.version}.module") + } else { + it.setPath("${project.name}-${directorySubname}/${project.version}/${project.name}-${directorySubname}-${project.version}.module") + } + } else { + it.exclude() + } + } + into "${project.group}".replace(".", "/") } pkg { repo = "InsanusMokrassar"