Compare commits

...

14 Commits

8 changed files with 139 additions and 32 deletions

View File

@ -1,5 +1,22 @@
# Changelog # Changelog
## 2.3.0
* `doWhile` now will guarantee that it will not call `doOnce` more than once for time
## 2.2.9
* `Version`:
* `Kotlin`: `1.9.23`
* `Serialization`: `1.6.3`
* `Klock`: `5.3.2`
* Fixes in build-in schedulers
## 2.2.8
* `Version`:
* `Coroutines`: `1.8.0`
## 2.2.7 ## 2.2.7
* `Version`: * `Version`:

View File

@ -18,13 +18,13 @@ if (new File(projectDir, "secret.gradle").exists()) {
githubRelease { githubRelease {
token "${project.property('GITHUB_RELEASE_TOKEN')}" token "${project.property('GITHUB_RELEASE_TOKEN')}"
owner "InsanusMokrassar" owner = "InsanusMokrassar"
repo "${rootProject.name}" repo = "${rootProject.name}"
tagName "v${project.version}" tagName = "v${project.version}"
releaseName "${project.version}" releaseName = "${project.version}"
targetCommitish "${project.version}" targetCommitish = "${project.version}"
body getCurrentVersionChangelog("${project.version}") body = getCurrentVersionChangelog("${project.version}")
} }
} }

View File

@ -9,17 +9,17 @@ android.useAndroidX=true
android.enableJetifier=false android.enableJetifier=false
kotlin_version=1.9.22 kotlin_version=1.9.23
kotlin_coroutines_version=1.7.3 kotlin_coroutines_version=1.8.0
kotlin_serialization_version=1.6.2 kotlin_serialization_version=1.6.3
dokka_version=1.9.10 dokka_version=1.9.20
klockVersion=5.3.1 klockVersion=5.4.0
## Github reease ## Github reease
github_release_plugin_version=2.4.1 github_release_plugin_version=2.5.2
## Android ## Android
@ -36,5 +36,5 @@ androidx_work_version=2.9.0
## Common ## Common
version=2.2.7 version=2.3.0
android_code_version=37 android_code_version=40

View File

@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip

View File

@ -71,9 +71,18 @@ suspend inline fun <T> doOnceTz(
* Will execute [block] while it will return true as a result of its calculation * Will execute [block] while it will return true as a result of its calculation
*/ */
suspend inline fun KronScheduler.doWhile(block: (DateTime) -> Boolean) { suspend inline fun KronScheduler.doWhile(block: (DateTime) -> Boolean) {
var latest: DateTime? = null
do { do {
delay(1L) delay(1L)
} while (doOnce(block)) val result = doOnce {
if (latest != it) {
latest = it
block(it)
} else {
null
}
}
} while (result == null || result)
} }
/** /**
* Will execute [block] while it will return true as a result of its calculation * Will execute [block] while it will return true as a result of its calculation
@ -85,9 +94,18 @@ suspend inline fun KronScheduler.doWhileLocal(block: (DateTime) -> Boolean) = do
* Will execute [block] while it will return true as a result of its calculation * Will execute [block] while it will return true as a result of its calculation
*/ */
suspend inline fun KronScheduler.doWhileTz(noinline block: suspend (DateTimeTz) -> Boolean) { suspend inline fun KronScheduler.doWhileTz(noinline block: suspend (DateTimeTz) -> Boolean) {
var latest: DateTimeTz? = null
do { do {
delay(1L) delay(1L)
} while (doOnceTz(block)) val result = doOnceTz {
if (latest != it) {
latest = it
block(it)
} else {
null
}
}
} while (result == null || result)
} }
/** /**

View File

@ -34,35 +34,60 @@ val EverySecondScheduler: KronScheduler by lazy {
* [KronScheduler.next] will always return [korlibs.time.DateTime.now] + one minute * [KronScheduler.next] will always return [korlibs.time.DateTime.now] + one minute
*/ */
val EveryMinuteScheduler: KronScheduler by lazy { val EveryMinuteScheduler: KronScheduler by lazy {
buildSchedule { minutes { 0 every 1 } } buildSchedule {
seconds { at(0) }
minutes { 0 every 1 }
}
} }
/** /**
* [KronScheduler.next] will always return [korlibs.time.DateTime.now] + one hour * [KronScheduler.next] will always return [korlibs.time.DateTime.now] + one hour
*/ */
val EveryHourScheduler: KronScheduler by lazy { val EveryHourScheduler: KronScheduler by lazy {
buildSchedule { hours { 0 every 1 } } buildSchedule {
seconds { at(0) }
minutes { at(0) }
hours { 0 every 1 }
}
} }
/** /**
* [KronScheduler.next] will always return [korlibs.time.DateTime.now] + one day * [KronScheduler.next] will always return [korlibs.time.DateTime.now] + one day
*/ */
val EveryDayOfMonthScheduler: KronScheduler by lazy { val EveryDayOfMonthScheduler: KronScheduler by lazy {
buildSchedule { dayOfMonth { 0 every 1 } } buildSchedule {
seconds { at(0) }
minutes { at(0) }
hours { at(0) }
dayOfMonth { 0 every 1 }
}
} }
/** /**
* [KronScheduler.next] will always return [korlibs.time.DateTime.now] + one month * [KronScheduler.next] will always return [korlibs.time.DateTime.now] + one month
*/ */
val EveryMonthScheduler: KronScheduler by lazy { val EveryMonthScheduler: KronScheduler by lazy {
buildSchedule { months { 0 every 1 } } buildSchedule {
seconds { at(0) }
minutes { at(0) }
hours { at(0) }
dayOfMonth { at(0) }
months { 0 every 1 }
}
} }
/** /**
* [KronScheduler.next] will always return [korlibs.time.DateTime.now] + one year * [KronScheduler.next] will always return [korlibs.time.DateTime.now] + one year
*/ */
val EveryYearScheduler: KronScheduler by lazy { val EveryYearScheduler: KronScheduler by lazy {
buildSchedule { years { 0 every 1 } } buildSchedule {
seconds { at(0) }
minutes { at(0) }
hours { at(0) }
dayOfMonth { at(0) }
months { at(0) }
years { 0 every 1 }
}
} }
/** /**

View File

@ -182,15 +182,24 @@ class SchedulerBuilder(
*/ */
fun build(): KronScheduler = offset ?.let { fun build(): KronScheduler = offset ?.let {
createKronSchedulerWithOffset( createKronSchedulerWithOffset(
seconds, seconds = seconds,
minutes, minutes = minutes,
hours, hours = hours,
dayOfMonth, dayOfMonth = dayOfMonth,
month, month = month,
year, years = year,
dayOfWeek, weekDays = dayOfWeek,
TimezoneOffset(it.minutes), offset = TimezoneOffset(it.minutes),
milliseconds ?: millisecondsArrayDefault milliseconds = milliseconds ?: millisecondsArrayDefault
) )
} ?: createKronScheduler(seconds, minutes, hours, dayOfMonth, month, year, dayOfWeek, milliseconds ?: millisecondsArrayDefault) } ?: createKronScheduler(
seconds = seconds,
minutes = minutes,
hours = hours,
dayOfMonth = dayOfMonth,
month = month,
years = year,
weekDays = dayOfWeek,
milliseconds = milliseconds ?: millisecondsArrayDefault
)
} }

View File

@ -0,0 +1,38 @@
package dev.inmo.krontab.utils
import dev.inmo.krontab.*
import korlibs.time.*
import kotlinx.coroutines.test.runTest
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.time.Duration.Companion.milliseconds
import kotlin.time.Duration.Companion.minutes
import kotlin.time.Duration.Companion.seconds
class BuildersTest {
@Test
fun presetsWorksCorrectly() {
val data = mapOf(
EverySecondScheduler to { it: DateTime -> if (it.milliseconds > 0 ) it + 1.seconds - it.milliseconds.milliseconds else it },
EveryMinuteScheduler to { it: DateTime -> if (it.seconds > 0 || it.milliseconds > 0 ) it + 1.minutes - it.seconds.seconds - it.milliseconds.milliseconds else it },
EveryHourScheduler to { it: DateTime -> if (it.minutes > 0 || it.seconds > 0 || it.milliseconds > 0 ) it + 1.hours - it.minutes.minutes - it.seconds.seconds - it.milliseconds.milliseconds else it },
EveryDayOfMonthScheduler to { it: DateTime -> if (it.hours > 0 || it.minutes > 0 || it.seconds > 0 || it.milliseconds > 0 ) it + 1.days - it.hours.hours - it.minutes.minutes - it.seconds.seconds - it.milliseconds.milliseconds else it },
EveryMonthScheduler to { it: DateTime -> if (it.dayOfMonth > 1 || it.hours > 0 || it.minutes > 0 || it.seconds > 0 || it.milliseconds > 0 ) (it + 1.months).copy(dayOfMonth = 1, hour = 0, minute = 0, second = 0, milliseconds = 0) else it },
)
val samples = 10000
runTest {
var now = DateTime.now()
for (i in 0 until samples) {
data.forEach { (scheduler, expectCalculator) ->
val expectValue = expectCalculator(now)
val newNow = scheduler.nextOrRelative(now)
assertEquals(expectValue, newNow, "For time ${now.toStringDefault()} calculated wrong value: ${newNow.toStringDefault()} is not equal to ${expectValue.toStringDefault()}")
now = newNow
}
}
}
}
}