mirror of
https://github.com/InsanusMokrassar/krontab.git
synced 2024-11-22 16:23:55 +00:00
commit
753dcae747
10
CHANGELOG.md
10
CHANGELOG.md
@ -9,6 +9,16 @@
|
|||||||
* Typealias `KrontabTemplate` was added
|
* Typealias `KrontabTemplate` was added
|
||||||
* Extension `KrontabTemplate#toSchedule` was added
|
* Extension `KrontabTemplate#toSchedule` was added
|
||||||
|
|
||||||
|
### 0.3.2
|
||||||
|
|
||||||
|
* Function `TimeBuilder#each` was added (works as `at`)
|
||||||
|
* Add opportunity to use `first` shortcuts:
|
||||||
|
* Value property `TimeBuilder#first` for including via functions like `TimeBuilder#at`
|
||||||
|
* Shortcut for kron string format `f` or `F`
|
||||||
|
* Add opportunity to use `last` shortcuts:
|
||||||
|
* Value property `TimeBuilder#last` for including via functions like `TimeBuilder#at`
|
||||||
|
* Shortcut for kron string format `l` or `L`
|
||||||
|
|
||||||
### 0.3.1
|
### 0.3.1
|
||||||
|
|
||||||
* Versions:
|
* Versions:
|
||||||
|
@ -17,7 +17,7 @@ plugins {
|
|||||||
id "org.jetbrains.dokka" version "$dokka_version"
|
id "org.jetbrains.dokka" version "$dokka_version"
|
||||||
}
|
}
|
||||||
|
|
||||||
project.version = "0.3.1"
|
project.version = "0.3.2"
|
||||||
project.group = "com.insanusmokrassar"
|
project.group = "com.insanusmokrassar"
|
||||||
|
|
||||||
apply from: "publish.gradle"
|
apply from: "publish.gradle"
|
||||||
|
@ -27,6 +27,8 @@ typealias KrontabTemplate = String
|
|||||||
* * {int}/{int}
|
* * {int}/{int}
|
||||||
* * */{int}
|
* * */{int}
|
||||||
* * {int}
|
* * {int}
|
||||||
|
* * F
|
||||||
|
* * L
|
||||||
*
|
*
|
||||||
* Additional info about ranges can be found in follow accordance:
|
* Additional info about ranges can be found in follow accordance:
|
||||||
*
|
*
|
||||||
@ -39,8 +41,9 @@ typealias KrontabTemplate = String
|
|||||||
* Examples:
|
* Examples:
|
||||||
*
|
*
|
||||||
* * "0/5 * * * *" for every five seconds triggering
|
* * "0/5 * * * *" for every five seconds triggering
|
||||||
|
* * "0/5,L * * * *" for every five seconds triggering and on 59 second
|
||||||
* * "0/15 30 * * *" for every 15th seconds in a half of each hour
|
* * "0/15 30 * * *" for every 15th seconds in a half of each hour
|
||||||
* * "1 2 3 4 5" for triggering in near first second of second minute of third hour of fourth day of may
|
* * "1 2 3 F,4,L 5" for triggering in near first second of second minute of third hour of fourth day of may
|
||||||
*
|
*
|
||||||
* @see com.insanusmokrassar.krontab.internal.createKronScheduler
|
* @see com.insanusmokrassar.krontab.internal.createKronScheduler
|
||||||
*/
|
*/
|
||||||
|
@ -12,6 +12,17 @@ sealed class TimeBuilder (
|
|||||||
) {
|
) {
|
||||||
private var result: Set<Int>? = null
|
private var result: Set<Int>? = null
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The first possible value of builder
|
||||||
|
*/
|
||||||
|
val first
|
||||||
|
get() = restrictionsRange.first
|
||||||
|
/**
|
||||||
|
* The last possible value of builder. Using of this variable equal to using "L" in strings
|
||||||
|
*/
|
||||||
|
val last
|
||||||
|
get() = restrictionsRange.last
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* After calling of this function this builder will allow any value of current time
|
* After calling of this function this builder will allow any value of current time
|
||||||
*/
|
*/
|
||||||
@ -37,6 +48,13 @@ sealed class TimeBuilder (
|
|||||||
result = (result ?: emptySet()) + value.clamp(restrictionsRange)
|
result = (result ?: emptySet()) + value.clamp(restrictionsRange)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shortcut for [at]. In fact will
|
||||||
|
*/
|
||||||
|
@Suppress("unused", "NOTHING_TO_INLINE")
|
||||||
|
inline infix fun each(value: Int) = at(value)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Just wrapper for more obvious writing something like "[from] 2 [every] 5". For example, for [SecondsBuilder] it
|
* Just wrapper for more obvious writing something like "[from] 2 [every] 5". For example, for [SecondsBuilder] it
|
||||||
* will mean "[from] second second [every] 5 seconds", or "2, 7, 13, ..."
|
* will mean "[from] second second [every] 5 seconds", or "2, 7, 13, ..."
|
||||||
@ -92,6 +110,15 @@ sealed class TimeBuilder (
|
|||||||
@Suppress("MemberVisibilityCanBePrivate")
|
@Suppress("MemberVisibilityCanBePrivate")
|
||||||
infix operator fun rangeTo(endIncluding: Int) = (this from 0) rangeTo endIncluding
|
infix operator fun rangeTo(endIncluding: Int) = (this from 0) rangeTo endIncluding
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Will include the last possible value
|
||||||
|
*/
|
||||||
|
fun includeLast() = at(restrictionsRange.last)
|
||||||
|
/**
|
||||||
|
* Will include the first possible value
|
||||||
|
*/
|
||||||
|
fun includeFirst() = at(restrictionsRange.first)
|
||||||
|
|
||||||
internal fun build() = result ?.map { it.toByte() } ?.toTypedArray()
|
internal fun build() = result ?.map { it.toByte() } ?.toTypedArray()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,7 +52,13 @@ internal fun CronDateTime.toNearDateTime(relativelyTo: DateTime = DateTime.now()
|
|||||||
}
|
}
|
||||||
|
|
||||||
klockDayOfMonth ?.let {
|
klockDayOfMonth ?.let {
|
||||||
val left = it - current.dayOfMonth
|
val left = (it - current.dayOfMonth).let { diff ->
|
||||||
|
if (diff > 0 && current.endOfMonth.run { it > dayOfMonth && current.dayOfMonth == dayOfMonth }) {
|
||||||
|
0
|
||||||
|
} else {
|
||||||
|
diff
|
||||||
|
}
|
||||||
|
}
|
||||||
current += DateTimeSpan(months = if (left < 0) 1 else 0, days = left)
|
current += DateTimeSpan(months = if (left < 0) 1 else 0, days = left)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,13 +6,18 @@ private fun createSimpleScheduler(from: String, dataRange: IntRange): Array<Byte
|
|||||||
val things = from.split(",")
|
val things = from.split(",")
|
||||||
|
|
||||||
val results = things.flatMap {
|
val results = things.flatMap {
|
||||||
|
val currentToken = it.toLowerCase().replace(
|
||||||
|
"f", dataRange.first.toString()
|
||||||
|
).replace(
|
||||||
|
"l", dataRange.last.toString()
|
||||||
|
)
|
||||||
when {
|
when {
|
||||||
it.contains("-") -> {
|
currentToken.contains("-") -> {
|
||||||
val splitted = it.split("-")
|
val splitted = currentToken.split("-")
|
||||||
(splitted.first().toInt().clamp(dataRange) .. splitted[1].toInt().clamp(dataRange)).toList()
|
(splitted.first().toInt().clamp(dataRange) .. splitted[1].toInt().clamp(dataRange)).toList()
|
||||||
}
|
}
|
||||||
it.contains("/") -> {
|
currentToken.contains("/") -> {
|
||||||
val (start, step) = it.split("/")
|
val (start, step) = currentToken.split("/")
|
||||||
val startNum = (if (start.isEmpty() || start == "*") {
|
val startNum = (if (start.isEmpty() || start == "*") {
|
||||||
0
|
0
|
||||||
} else {
|
} else {
|
||||||
@ -21,8 +26,8 @@ private fun createSimpleScheduler(from: String, dataRange: IntRange): Array<Byte
|
|||||||
val stepNum = step.toInt().clamp(dataRange)
|
val stepNum = step.toInt().clamp(dataRange)
|
||||||
(startNum .. dataRange.last step stepNum).map { it }
|
(startNum .. dataRange.last step stepNum).map { it }
|
||||||
}
|
}
|
||||||
it == "*" -> return null
|
currentToken == "*" -> return null
|
||||||
else -> listOf(it.toInt().clamp(dataRange))
|
else -> listOf(currentToken.toInt().clamp(dataRange))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user