diff --git a/CHANGELOG.md b/CHANGELOG.md index 0524856..2206b6e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,13 @@ * Coroutines `1.3.2` -> `1.3.3` * Klock `1.7.3` -> `1.8.6` +### 0.2.4 + +* Updates in libraries: + * Klock `1.11.3` -> `1.11.14` + * Coroutines `1.3.7` -> `1.3.8` +* Ranges support were included. Now it is possible to correctly use syntax `0-5` in strings schedules + ### 0.2.3 * Updates in libraries: diff --git a/build.gradle b/build.gradle index 735b4cd..3878027 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ plugins { id "org.jetbrains.dokka" version "$dokka_version" } -project.version = "0.2.3" +project.version = "0.2.4" project.group = "com.insanusmokrassar" apply from: "publish.gradle" diff --git a/gradle.properties b/gradle.properties index 4da145e..bc62003 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,11 +1,11 @@ kotlin.code.style=official kotlin_version=1.3.72 -kotlin_coroutines_version=1.3.7 +kotlin_coroutines_version=1.3.8 dokka_version=0.10.1 gradle_bintray_plugin_version=1.8.4 -klockVersion=1.11.3 +klockVersion=1.11.14 kotlin.incremental.multiplatform=true diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d66d2a1..1204836 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -# Tue May 21 17:58:54 HKT 2019 +# Fri Jul 24 23:52:00 +06 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.0.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-bin.zip diff --git a/src/commonMain/kotlin/com/insanusmokrassar/krontab/Executes.kt b/src/commonMain/kotlin/com/insanusmokrassar/krontab/Executes.kt index 55acf5b..aab03af 100644 --- a/src/commonMain/kotlin/com/insanusmokrassar/krontab/Executes.kt +++ b/src/commonMain/kotlin/com/insanusmokrassar/krontab/Executes.kt @@ -7,7 +7,7 @@ import kotlinx.coroutines.delay /** * Execute [block] once at the [KronScheduler.next] time and return result of [block] calculation. * - * WARNING!!! If you want to launch it in parallel, you must do this explicit. + * WARNING!!! If you want to launch it in parallel, you must do this explicitly. */ suspend inline fun KronScheduler.doOnce(noinline block: suspend () -> T): T { delay((next() - DateTime.now()).millisecondsLong) @@ -15,12 +15,13 @@ suspend inline fun KronScheduler.doOnce(noinline block: suspend () -> T): T } /** - * Will [createSimpleScheduler] using [scheduleConfig] and call [doOnce] on it + * Will [buildSchedule] using [scheduleConfig] and call [doOnce] on it + * @see buildSchedule */ suspend inline fun doOnce( scheduleConfig: String, noinline block: suspend () -> T -) = createSimpleScheduler(scheduleConfig).doOnce(block) +) = buildSchedule(scheduleConfig).doOnce(block) /** * Will execute [block] while it will return true as a result of its calculation @@ -30,12 +31,14 @@ suspend inline fun KronScheduler.doWhile(noinline block: suspend () -> Boolean) } /** - * Will [createSimpleScheduler] using [scheduleConfig] and call [doWhile] with [block] + * Will [buildSchedule] using [scheduleConfig] and call [doWhile] with [block] + * + * @see buildSchedule */ suspend inline fun doWhile( scheduleConfig: String, noinline block: suspend () -> Boolean -) = createSimpleScheduler(scheduleConfig).doWhile(block) +) = buildSchedule(scheduleConfig).doWhile(block) /** * Will execute [block] without any checking of result @@ -45,9 +48,11 @@ suspend inline fun KronScheduler.doInfinity(noinline block: suspend () -> Unit) true } /** - * Will [createSimpleScheduler] using [scheduleConfig] and call [doInfinity] with [block] + * Will [buildSchedule] using [scheduleConfig] and call [doInfinity] with [block] + * + * @see buildSchedule */ suspend inline fun doInfinity( scheduleConfig: String, noinline block: suspend () -> Unit -) = createSimpleScheduler(scheduleConfig).doInfinity(block) +) = buildSchedule(scheduleConfig).doInfinity(block) diff --git a/src/commonMain/kotlin/com/insanusmokrassar/krontab/StringParser.kt b/src/commonMain/kotlin/com/insanusmokrassar/krontab/StringParser.kt index fffb1a3..b8b41ee 100644 --- a/src/commonMain/kotlin/com/insanusmokrassar/krontab/StringParser.kt +++ b/src/commonMain/kotlin/com/insanusmokrassar/krontab/StringParser.kt @@ -13,7 +13,7 @@ import com.insanusmokrassar.krontab.internal.* * * And each one have next format: * - * `{number},{number},...` + * `{number}[,{number},...]` or `*` * * and {number} here is one of * @@ -53,6 +53,6 @@ fun createSimpleScheduler(incoming: String): KronScheduler { } /** - * + * Shortcut for [createSimpleScheduler] */ fun buildSchedule(incoming: String): KronScheduler = createSimpleScheduler(incoming) \ No newline at end of file diff --git a/src/commonMain/kotlin/com/insanusmokrassar/krontab/builder/TimeBuilder.kt b/src/commonMain/kotlin/com/insanusmokrassar/krontab/builder/TimeBuilder.kt index f20a809..d0653f4 100644 --- a/src/commonMain/kotlin/com/insanusmokrassar/krontab/builder/TimeBuilder.kt +++ b/src/commonMain/kotlin/com/insanusmokrassar/krontab/builder/TimeBuilder.kt @@ -81,6 +81,16 @@ sealed class TimeBuilder ( */ @Suppress("unused") infix fun upTo(endIncluding: Int): Array = this from 0 upTo endIncluding + /** + * Will fill up this timeline from [this] up to [endIncluding] + */ + @Suppress("MemberVisibilityCanBePrivate") + infix operator fun Int.rangeTo(endIncluding: Int) = upTo(endIncluding) + /** + * Shortcut for "[from] 0 [rangeTo] [endIncluding]" + */ + @Suppress("MemberVisibilityCanBePrivate") + infix operator fun rangeTo(endIncluding: Int) = (this from 0) rangeTo endIncluding internal fun build() = result ?.map { it.toByte() } ?.toTypedArray() } diff --git a/src/commonMain/kotlin/com/insanusmokrassar/krontab/internal/CronDateTime.kt b/src/commonMain/kotlin/com/insanusmokrassar/krontab/internal/CronDateTime.kt index 4a04474..bf173c8 100644 --- a/src/commonMain/kotlin/com/insanusmokrassar/krontab/internal/CronDateTime.kt +++ b/src/commonMain/kotlin/com/insanusmokrassar/krontab/internal/CronDateTime.kt @@ -28,30 +28,6 @@ internal data class CronDateTime( } internal val klockDayOfMonth = dayOfMonth ?.plus(1) - - companion object { - /** - * Using [clamp] extension for checking every parameter to be ensure that they are all correct - * @param month 0-11 - * @param dayOfMonth 0-31 - * @param hours 0-23 - * @param minutes 0-59 - * @param seconds 0-59 - */ - fun create( - month: Int? = null, - dayOfMonth: Int? = null, - hours: Int? = null, - minutes: Int? = null, - seconds: Int? = null - ) = CronDateTime( - month ?.clamp(monthRange) ?.toByte(), - dayOfMonth ?.clamp(dayOfMonthRange) ?.toByte(), - hours ?.clamp(hoursRange) ?.toByte(), - minutes ?.clamp(minutesRange) ?.toByte(), - seconds ?.clamp(secondsRange) ?.toByte() - ) - } } /** diff --git a/src/commonMain/kotlin/com/insanusmokrassar/krontab/internal/Parser.kt b/src/commonMain/kotlin/com/insanusmokrassar/krontab/internal/Parser.kt index dd152eb..d3b9492 100644 --- a/src/commonMain/kotlin/com/insanusmokrassar/krontab/internal/Parser.kt +++ b/src/commonMain/kotlin/com/insanusmokrassar/krontab/internal/Parser.kt @@ -7,6 +7,10 @@ private fun createSimpleScheduler(from: String, dataRange: IntRange): Array { + val splitted = it.split("-") + (splitted.first().toInt().clamp(dataRange) .. splitted[1].toInt().clamp(dataRange)).toList() + } it.contains("/") -> { val (start, step) = it.split("/") val startNum = (if (start.isEmpty() || start == "*") { diff --git a/src/commonTest/kotlin/com/insanusmokrassar/krontab/utils/StringParseTest.kt b/src/commonTest/kotlin/com/insanusmokrassar/krontab/utils/StringParseTest.kt index 406852a..383788a 100644 --- a/src/commonTest/kotlin/com/insanusmokrassar/krontab/utils/StringParseTest.kt +++ b/src/commonTest/kotlin/com/insanusmokrassar/krontab/utils/StringParseTest.kt @@ -1,12 +1,12 @@ package com.insanusmokrassar.krontab.utils import com.insanusmokrassar.krontab.buildSchedule -import com.insanusmokrassar.krontab.builder.buildSchedule -import com.insanusmokrassar.krontab.createSimpleScheduler import com.soywiz.klock.DateTime import kotlinx.coroutines.* import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.takeWhile +import kotlin.math.max +import kotlin.math.min import kotlin.test.Test import kotlin.test.assertEquals @@ -60,4 +60,23 @@ class StringParseTest { } } } + @Test + fun testThatFlowIsCorrectlyWorkEverySeveralSecondsRangeBuiltOnString() { + val rangesEnds = listOf(0 to 5, 30 to 35) + val kronScheduler = buildSchedule("${rangesEnds.joinToString(",") { "${it.first}-${it.second}" }} * * * *") + + val flow = kronScheduler.asFlow() + + runTest { + val ranges = rangesEnds.map { it.first .. it.second }.flatten().toMutableList() + val expectedCollects = rangesEnds.sumBy { it.second - it.first + 1 } + var collected = 0 + + flow.takeWhile { ranges.isNotEmpty() }.collect { + ranges.remove(it.seconds) + collected++ + } + assertEquals(expectedCollects, collected) + } + } }