From 5358bfdb4710b4688b21f1a14f2ccf145331c778 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 24 Jul 2020 13:16:56 +0600 Subject: [PATCH] add support of ranges in strings --- CHANGELOG.md | 1 + .../krontab/builder/TimeBuilder.kt | 10 ++++++++ .../krontab/internal/Parser.kt | 4 ++++ .../krontab/utils/StringParseTest.kt | 23 +++++++++++++++++-- 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 859dd49..5d25e7a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ * Updates in libraries: * Klock `1.11.3` -> `1.11.14` * Coroutines `1.3.7` -> `1.3.8` +* Ranges support was included. Now it is possible to correctly use syntax `0-5` in strings schedules ### 0.2.3 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/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) + } + } }