mirror of
https://github.com/InsanusMokrassar/krontab.git
synced 2025-12-23 21:35:47 +00:00
Compare commits
47 Commits
f163a64964
...
v0.9.0
| Author | SHA1 | Date | |
|---|---|---|---|
| f6518d4d25 | |||
| 97a8f39826 | |||
| 469861f7e3 | |||
| 69305506ce | |||
| 63ea3f0f1a | |||
| 13a8bacb52 | |||
| 9c80e29e71 | |||
| cfd2de8fe9 | |||
| e3490d432e | |||
| 1c95636b71 | |||
| b31a6ab86a | |||
| c35a679827 | |||
| 06f56026db | |||
| 54be57d709 | |||
| fae297e4a6 | |||
| bd81298ac9 | |||
| cfac5fcd1c | |||
| 93d38f8945 | |||
| 97dcd77a8a | |||
| afa2521b5d | |||
| 37b0ec9fb7 | |||
| d36888173a | |||
| 30011cd309 | |||
| fd37a5ddc3 | |||
| 3874f6a42c | |||
| 8a98ebd5f9 | |||
| 8d0c55129f | |||
| 54b06bf9e6 | |||
| da436ab432 | |||
| 154d211514 | |||
| 0b843ada4f | |||
| 25f204a488 | |||
| 2e4ccb9253 | |||
| 411a52b85e | |||
| 5a5bde6f20 | |||
| 8f9b84ecc7 | |||
| 62c5a0f98d | |||
| dfd1a5a909 | |||
| 04390f0726 | |||
| d0f02e37ce | |||
| 681043db5a | |||
| f63ed1a873 | |||
| 9ea8194d7d | |||
| 0c37ccc902 | |||
| 2abef58335 | |||
| 8ac6cd3e62 | |||
| 58f30aef15 |
10
.github/workflows/publishing_packages.yml
vendored
10
.github/workflows/publishing_packages.yml
vendored
@@ -8,18 +8,20 @@ jobs:
|
|||||||
- uses: actions/setup-java@v1
|
- uses: actions/setup-java@v1
|
||||||
with:
|
with:
|
||||||
java-version: 11
|
java-version: 11
|
||||||
- name: Fix android 32.0.0 dx
|
|
||||||
continue-on-error: true
|
|
||||||
run: cd /usr/local/lib/android/sdk/build-tools/32.0.0/ && cp d8 dx && cd lib && cp d8.jar dx.jar
|
|
||||||
- name: Update version
|
- name: Update version
|
||||||
run: |
|
run: |
|
||||||
branch="`echo "${{ github.ref }}" | grep -o "[^/]*$"`"
|
branch="`echo "${{ github.ref }}" | grep -o "[^/]*$"`"
|
||||||
sed -i -e "s/^version=\([0-9\.]*\)/version=\1-branch_$branch-build${{ github.run_number }}/" gradle.properties
|
sed -i -e "s/^version=\([0-9\.]*\)/version=\1-branch_$branch-build${{ github.run_number }}/" gradle.properties
|
||||||
- name: prebuild
|
- name: prebuild
|
||||||
run: ./gradlew clean build
|
run: ./gradlew clean build
|
||||||
|
- name: Publish to Gitea
|
||||||
|
continue-on-error: true
|
||||||
|
run: ./gradlew publishAllPublicationsToGiteaRepository
|
||||||
|
env:
|
||||||
|
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
|
||||||
- name: Publish package
|
- name: Publish package
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
run: ./gradlew --no-parallel publishAllPublicationsToGithubPackagesRepository -x signJsPublication -x signJvmPublication -x signKotlinMultiplatformPublication -x signAndroidReleasePublication -x signAndroidDebugPublication -x signAndroidReleasePublication
|
run: ./gradlew --no-parallel publishAllPublicationsToGithubPackagesRepository
|
||||||
env:
|
env:
|
||||||
GITHUBPACKAGES_USER: ${{ github.actor }}
|
GITHUBPACKAGES_USER: ${{ github.actor }}
|
||||||
GITHUBPACKAGES_PASSWORD: ${{ secrets.GITHUB_TOKEN }}
|
GITHUBPACKAGES_PASSWORD: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -9,4 +9,6 @@ settings.xml
|
|||||||
build/
|
build/
|
||||||
out/
|
out/
|
||||||
|
|
||||||
|
kotlin-js-store/
|
||||||
|
|
||||||
local.properties
|
local.properties
|
||||||
|
|||||||
62
CHANGELOG.md
62
CHANGELOG.md
@@ -1,5 +1,67 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 0.9.0
|
||||||
|
|
||||||
|
* Versions
|
||||||
|
* `Kotlin`: `1.8.10`
|
||||||
|
* `AndroidXWork`: `2.8.0`
|
||||||
|
|
||||||
|
## 0.8.5
|
||||||
|
|
||||||
|
* Project is now available in owner `Gitea`: https://git.inmo.dev/InsanusMokrassar/-/packages/maven/dev.inmo-krontab
|
||||||
|
* `KronSchedulerTz#next` with incoming `DateTime` now will use adjusted local time instead of unadjusted one
|
||||||
|
* `CronDateTimeSchedulerTz#next` with incoming `DateTime` will convert that parameter to internal offset directly
|
||||||
|
|
||||||
|
## 0.8.4
|
||||||
|
|
||||||
|
* Versions
|
||||||
|
* `Kotlin`: `1.7.22`
|
||||||
|
|
||||||
|
## 0.8.3
|
||||||
|
|
||||||
|
* Versions
|
||||||
|
* `Kotlin`: `1.7.21`
|
||||||
|
* `Klock`: `3.4.0`
|
||||||
|
|
||||||
|
## 0.8.2
|
||||||
|
|
||||||
|
**THIS VERSION HAS CHANGED COMPILE ANDROID SDK FROM 32 -> 33**
|
||||||
|
|
||||||
|
* Versions
|
||||||
|
* `Kotlin`: `1.7.20`
|
||||||
|
* `Klock`: `3.2.0`
|
||||||
|
|
||||||
|
## 0.8.1
|
||||||
|
|
||||||
|
* Versions
|
||||||
|
* `Klock`: `3.1.0`
|
||||||
|
|
||||||
|
## 0.8.0
|
||||||
|
|
||||||
|
**THIS VERSION HAS CHANGED MIN ANDROID SDK FROM 19 -> 21**
|
||||||
|
|
||||||
|
* Versions
|
||||||
|
* `Kotlin`: `1.7.10`
|
||||||
|
* `Klock`: `3.0.0`
|
||||||
|
|
||||||
|
## 0.7.5
|
||||||
|
|
||||||
|
* Versions
|
||||||
|
* `Coroutines`: `1.6.4`
|
||||||
|
|
||||||
|
## 0.7.4
|
||||||
|
|
||||||
|
* Versions
|
||||||
|
* `Coroutines`: `1.6.3`
|
||||||
|
|
||||||
|
## 0.7.3
|
||||||
|
|
||||||
|
* Versions
|
||||||
|
* `Kotlin`: `1.6.21`
|
||||||
|
* Several bug fixes ([#27](https://github.com/InsanusMokrassar/krontab/issues/27), [#34](https://github.com/InsanusMokrassar/krontab/issues/34))
|
||||||
|
* New factories for `KronScheduler` and `KronSchedulerTz` (fix of [#35](https://github.com/InsanusMokrassar/krontab/issues/35))
|
||||||
|
* Fill extensions for flow with time zones (fix of [#33](https://github.com/InsanusMokrassar/krontab/issues/33))
|
||||||
|
|
||||||
## 0.7.2
|
## 0.7.2
|
||||||
|
|
||||||
* Versions
|
* Versions
|
||||||
|
|||||||
15
README.md
15
README.md
@@ -1,9 +1,16 @@
|
|||||||
# krontab
|
# krontab
|
||||||
|
|
||||||
[](https://maven-badges.herokuapp.com/maven-central/dev.inmo/krontab)
|
[](https://maven-badges.herokuapp.com/maven-central/dev.inmo/krontab)
|
||||||
[](https://github.com/InsanusMokrassar/krontab/actions/workflows/publishing_packages.yml)
|
|
||||||
[](https://krontab.inmo.dev/index.html)
|
[](https://inmodev_chat.t.me)
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
[](https://insanusmokrassar.github.io/krontab/)
|
||||||
|
[](https://bookstack.inmo.dev/books/krontab)
|
||||||
|
|
||||||
Library was created to give oppotunity to launch some things from time to time according to some schedule in
|
Library was created to give oppotunity to launch some things from time to time according to some schedule in
|
||||||
runtime of applications.
|
runtime of applications.
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ if (new File(projectDir, "secret.gradle").exists()) {
|
|||||||
owner "InsanusMokrassar"
|
owner "InsanusMokrassar"
|
||||||
repo "${rootProject.name}"
|
repo "${rootProject.name}"
|
||||||
|
|
||||||
tagName "${project.version}"
|
tagName "v${project.version}"
|
||||||
releaseName "${project.version}"
|
releaseName "${project.version}"
|
||||||
targetCommitish "${project.version}"
|
targetCommitish "${project.version}"
|
||||||
|
|
||||||
|
|||||||
@@ -8,30 +8,30 @@ android.useAndroidX=true
|
|||||||
android.enableJetifier=false
|
android.enableJetifier=false
|
||||||
|
|
||||||
|
|
||||||
kotlin_version=1.6.21
|
kotlin_version=1.8.10
|
||||||
kotlin_coroutines_version=1.6.1
|
kotlin_coroutines_version=1.6.4
|
||||||
|
|
||||||
dokka_version=1.6.21
|
dokka_version=1.7.20
|
||||||
|
|
||||||
klockVersion=2.7.0
|
klockVersion=3.4.0
|
||||||
|
|
||||||
## Github reease
|
## Github reease
|
||||||
|
|
||||||
github_release_plugin_version=2.3.7
|
github_release_plugin_version=2.4.1
|
||||||
|
|
||||||
## Android
|
## Android
|
||||||
|
|
||||||
android_minSdkVersion=19
|
android_minSdkVersion=21
|
||||||
android_compileSdkVersion=32
|
android_compileSdkVersion=33
|
||||||
android_buildToolsVersion=32.0.0
|
android_buildToolsVersion=33.0.1
|
||||||
dexcount_version=3.0.1
|
dexcount_version=3.1.0
|
||||||
junit_version=4.12
|
junit_version=4.12
|
||||||
test_ext_junit_version=1.1.2
|
test_ext_junit_version=1.1.3
|
||||||
espresso_core=3.3.0
|
espresso_core=3.4.0
|
||||||
|
|
||||||
androidx_work_version=2.7.1
|
androidx_work_version=2.8.0
|
||||||
|
|
||||||
## Common
|
## Common
|
||||||
|
|
||||||
version=0.7.3
|
version=0.9.0
|
||||||
android_code_version=14
|
android_code_version=23
|
||||||
|
|||||||
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -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-7.4-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1 +1 @@
|
|||||||
{"licenses":[{"id":"Apache-2.0","title":"Apache Software License 2.0","url":"https://github.com/InsanusMokrassar/krontab/blob/master/LICENSE"}],"mavenConfig":{"name":"Krontab","description":"It is an analog of crontab util for Kotlin Coroutines","url":"https://github.com/InsanusMokrassar/krontab","vcsUrl":"https://github.com/InsanusMokrassar/krontab.git","includeGpgSigning":true,"developers":[{"id":"InsanusMokrassar","name":"Ovsiannikov Aleksei","eMail":"ovsyannikov.alexey95@gmail.com"}],"repositories":[{"name":"GithubPackages","url":"https://maven.pkg.github.com/InsanusMokrassar/krontab"},{"name":"sonatype","url":"https://oss.sonatype.org/service/local/staging/deploy/maven2/"}]}}
|
{"licenses":[{"id":"Apache-2.0","title":"Apache Software License 2.0","url":"https://github.com/InsanusMokrassar/krontab/blob/master/LICENSE"}],"mavenConfig":{"name":"Krontab","description":"It is an analog of crontab util for Kotlin Coroutines","url":"https://github.com/InsanusMokrassar/krontab","vcsUrl":"https://github.com/InsanusMokrassar/krontab.git","developers":[{"id":"InsanusMokrassar","name":"Ovsiannikov Aleksei","eMail":"ovsyannikov.alexey95@gmail.com"}],"repositories":[{"name":"GithubPackages","url":"https://maven.pkg.github.com/InsanusMokrassar/krontab"},{"name":"Gitea","url":"https://git.inmo.dev/api/packages/InsanusMokrassar/maven","credsType":{"type":"dev.inmo.kmppscriptbuilder.core.models.MavenPublishingRepository.CredentialsType.HttpHeaderCredentials","headerName":"Authorization","headerValueProperty":"GITEA_TOKEN"}},{"name":"sonatype","url":"https://oss.sonatype.org/service/local/staging/deploy/maven2/"}],"gpgSigning":{"type":"dev.inmo.kmppscriptbuilder.core.models.GpgSigning.Optional"}}}
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
apply plugin: 'maven-publish'
|
apply plugin: 'maven-publish'
|
||||||
apply plugin: 'signing'
|
|
||||||
|
|
||||||
task javadocsJar(type: Jar) {
|
task javadocsJar(type: Jar) {
|
||||||
classifier = 'javadoc'
|
classifier = 'javadoc'
|
||||||
@@ -43,27 +42,58 @@ publishing {
|
|||||||
maven {
|
maven {
|
||||||
name = "GithubPackages"
|
name = "GithubPackages"
|
||||||
url = uri("https://maven.pkg.github.com/InsanusMokrassar/krontab")
|
url = uri("https://maven.pkg.github.com/InsanusMokrassar/krontab")
|
||||||
|
|
||||||
credentials {
|
credentials {
|
||||||
username = project.hasProperty('GITHUBPACKAGES_USER') ? project.property('GITHUBPACKAGES_USER') : System.getenv('GITHUBPACKAGES_USER')
|
username = project.hasProperty('GITHUBPACKAGES_USER') ? project.property('GITHUBPACKAGES_USER') : System.getenv('GITHUBPACKAGES_USER')
|
||||||
password = project.hasProperty('GITHUBPACKAGES_PASSWORD') ? project.property('GITHUBPACKAGES_PASSWORD') : System.getenv('GITHUBPACKAGES_PASSWORD')
|
password = project.hasProperty('GITHUBPACKAGES_PASSWORD') ? project.property('GITHUBPACKAGES_PASSWORD') : System.getenv('GITHUBPACKAGES_PASSWORD')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (project.hasProperty('GITEA_TOKEN') || System.getenv('GITEA_TOKEN') != null) {
|
||||||
|
maven {
|
||||||
|
name = "Gitea"
|
||||||
|
url = uri("https://git.inmo.dev/api/packages/InsanusMokrassar/maven")
|
||||||
|
|
||||||
|
credentials(HttpHeaderCredentials) {
|
||||||
|
name = "Authorization"
|
||||||
|
value = project.hasProperty('GITEA_TOKEN') ? project.property('GITEA_TOKEN') : System.getenv('GITEA_TOKEN')
|
||||||
|
}
|
||||||
|
|
||||||
|
authentication {
|
||||||
|
header(HttpHeaderAuthentication)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((project.hasProperty('SONATYPE_USER') || System.getenv('SONATYPE_USER') != null) && (project.hasProperty('SONATYPE_PASSWORD') || System.getenv('SONATYPE_PASSWORD') != null)) {
|
if ((project.hasProperty('SONATYPE_USER') || System.getenv('SONATYPE_USER') != null) && (project.hasProperty('SONATYPE_PASSWORD') || System.getenv('SONATYPE_PASSWORD') != null)) {
|
||||||
maven {
|
maven {
|
||||||
name = "sonatype"
|
name = "sonatype"
|
||||||
url = uri("https://oss.sonatype.org/service/local/staging/deploy/maven2/")
|
url = uri("https://oss.sonatype.org/service/local/staging/deploy/maven2/")
|
||||||
|
|
||||||
credentials {
|
credentials {
|
||||||
username = project.hasProperty('SONATYPE_USER') ? project.property('SONATYPE_USER') : System.getenv('SONATYPE_USER')
|
username = project.hasProperty('SONATYPE_USER') ? project.property('SONATYPE_USER') : System.getenv('SONATYPE_USER')
|
||||||
password = project.hasProperty('SONATYPE_PASSWORD') ? project.property('SONATYPE_PASSWORD') : System.getenv('SONATYPE_PASSWORD')
|
password = project.hasProperty('SONATYPE_PASSWORD') ? project.property('SONATYPE_PASSWORD') : System.getenv('SONATYPE_PASSWORD')
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
signing {
|
if (project.hasProperty("signing.gnupg.keyName")) {
|
||||||
useGpgCmd()
|
apply plugin: 'signing'
|
||||||
sign publishing.publications
|
|
||||||
|
signing {
|
||||||
|
useGpgCmd()
|
||||||
|
|
||||||
|
sign publishing.publications
|
||||||
|
}
|
||||||
|
|
||||||
|
task signAll {
|
||||||
|
tasks.withType(Sign).forEach {
|
||||||
|
dependsOn(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import com.soywiz.klock.DateTimeTz
|
|||||||
interface KronSchedulerTz : KronScheduler {
|
interface KronSchedulerTz : KronScheduler {
|
||||||
suspend fun next(relatively: DateTimeTz): DateTimeTz?
|
suspend fun next(relatively: DateTimeTz): DateTimeTz?
|
||||||
|
|
||||||
override suspend fun next(relatively: DateTime): DateTime? = next(relatively.localUnadjusted) ?.local
|
override suspend fun next(relatively: DateTime): DateTime? = next(relatively.local) ?.local
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun KronSchedulerTz.nextOrRelative(relatively: DateTimeTz): DateTimeTz = next(relatively) ?: getAnyNext(
|
suspend fun KronSchedulerTz.nextOrRelative(relatively: DateTimeTz): DateTimeTz = next(relatively) ?: getAnyNext(
|
||||||
@@ -31,4 +31,4 @@ suspend fun KronScheduler.next(relatively: DateTimeTz) = if (this is KronSchedul
|
|||||||
this.next(relatively.local) ?.toOffsetUnadjusted(relatively.offset)
|
this.next(relatively.local) ?.toOffsetUnadjusted(relatively.offset)
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun KronScheduler.nextTimeZoned() = next(DateTime.now().local)
|
suspend fun KronScheduler.nextTimeZoned() = next(DateTime.now().local)
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package dev.inmo.krontab
|
||||||
|
|
||||||
|
import com.soywiz.klock.DateTime
|
||||||
|
|
||||||
|
class LambdaKronScheduler(
|
||||||
|
private val onNext: suspend (DateTime) -> DateTime?
|
||||||
|
) : KronScheduler {
|
||||||
|
override suspend fun next(relatively: DateTime): DateTime? = onNext(relatively)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun KronScheduler(
|
||||||
|
onNext: suspend (DateTime) -> DateTime?
|
||||||
|
) = LambdaKronScheduler(onNext)
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package dev.inmo.krontab
|
||||||
|
|
||||||
|
import com.soywiz.klock.DateTimeTz
|
||||||
|
|
||||||
|
class LambdaKronSchedulerTz(
|
||||||
|
private val onNext: suspend (DateTimeTz) -> DateTimeTz?
|
||||||
|
) : KronSchedulerTz {
|
||||||
|
override suspend fun next(relatively: DateTimeTz): DateTimeTz? = onNext(relatively)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun KronSchedulerTz(
|
||||||
|
onNext: suspend (DateTimeTz) -> DateTimeTz?
|
||||||
|
) = LambdaKronSchedulerTz(onNext)
|
||||||
@@ -57,13 +57,13 @@ typealias KrontabTemplate = String
|
|||||||
* * "0/5,L * * * *" for every five seconds triggering and on 59 second
|
* * "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
|
||||||
* * "0/15 30 * * * 500ms" for every 15th seconds in a half of each hour when milliseconds equal to 500
|
* * "0/15 30 * * * 500ms" for every 15th seconds in a half of each hour when milliseconds equal to 500
|
||||||
* * "1 2 3 F,4,L 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 first, fifth and last days of may
|
||||||
* * "1 2 3 F,4,L 5 60o" for triggering in near first second of second minute of third hour of fourth day of may with timezone UTC+01:00
|
* * "1 2 3 F,4,L 5 60o" for triggering in near first second of second minute of third hour of first, fifth and last days of may with timezone UTC+01:00
|
||||||
* * "1 2 3 F,4,L 5 60o 0-2w" for triggering in near first second of second minute of third hour of fourth day of may in case if it will be in Sunday-Tuesday week days with timezone UTC+01:00
|
* * "1 2 3 F,4,L 5 60o 0-2w" for triggering in near first second of second minute of third hour of first, fifth and last days of may in case if it will be in Sunday-Tuesday week days with timezone UTC+01:00
|
||||||
* * "1 2 3 F,4,L 5 2021" for triggering in near first second of second minute of third hour of fourth day of may of 2021st year
|
* * "1 2 3 F,4,L 5 2021" for triggering in near first second of second minute of third hour of first, fifth and last days of may of 2021st year
|
||||||
* * "1 2 3 F,4,L 5 2021 60o" for triggering in near first second of second minute of third hour of fourth day of may of 2021st year with timezone UTC+01:00
|
* * "1 2 3 F,4,L 5 2021 60o" for triggering in near first second of second minute of third hour of first, fifth and last days of may of 2021st year with timezone UTC+01:00
|
||||||
* * "1 2 3 F,4,L 5 2021 60o 0-2w" for triggering in near first second of second minute of third hour of fourth day of may of 2021st year if it will be in Sunday-Tuesday week days with timezone UTC+01:00
|
* * "1 2 3 F,4,L 5 2021 60o 0-2w" for triggering in near first second of second minute of third hour of first, fifth and last days of may of 2021st year if it will be in Sunday-Tuesday week days with timezone UTC+01:00
|
||||||
* * "1 2 3 F,4,L 5 2021 60o 0-2w 500ms" for triggering in near first second of second minute of third hour of fourth day of may of 2021st year if it will be in Sunday-Tuesday week days with timezone UTC+01:00 when milliseconds will be equal to 500
|
* * "1 2 3 F,4,L 5 2021 60o 0-2w 500ms" for triggering in near first second of second minute of third hour of first, fifth and last days of may of 2021st year if it will be in Sunday-Tuesday week days with timezone UTC+01:00 when milliseconds will be equal to 500
|
||||||
*
|
*
|
||||||
* @return In case when offset parameter is absent in [incoming] will be used [createSimpleScheduler] method and
|
* @return In case when offset parameter is absent in [incoming] will be used [createSimpleScheduler] method and
|
||||||
* returned [CronDateTimeScheduler]. In case when offset parameter there is in [incoming] [KrontabTemplate] will be used
|
* returned [CronDateTimeScheduler]. In case when offset parameter there is in [incoming] [KrontabTemplate] will be used
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import dev.inmo.krontab.KronScheduler
|
|||||||
* @param daysOfWeek 0-6
|
* @param daysOfWeek 0-6
|
||||||
* @param years any int
|
* @param years any int
|
||||||
* @param months 0-11
|
* @param months 0-11
|
||||||
* @param daysOfMonth 0-31
|
* @param daysOfMonth 0-30
|
||||||
* @param hours 0-23
|
* @param hours 0-23
|
||||||
* @param minutes 0-59
|
* @param minutes 0-59
|
||||||
* @param seconds 0-59
|
* @param seconds 0-59
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package dev.inmo.krontab.internal
|
package dev.inmo.krontab.internal
|
||||||
|
|
||||||
|
import com.soywiz.klock.DateTime
|
||||||
import com.soywiz.klock.DateTimeTz
|
import com.soywiz.klock.DateTimeTz
|
||||||
import com.soywiz.klock.TimezoneOffset
|
import com.soywiz.klock.TimezoneOffset
|
||||||
import dev.inmo.krontab.KronScheduler
|
import dev.inmo.krontab.KronScheduler
|
||||||
@@ -18,6 +19,10 @@ internal data class CronDateTimeSchedulerTz internal constructor(
|
|||||||
val dateTimeWithActualOffset = relatively.toOffset(offset).local
|
val dateTimeWithActualOffset = relatively.toOffset(offset).local
|
||||||
return cronDateTime.toNearDateTime(dateTimeWithActualOffset) ?.toOffsetUnadjusted(offset) ?.toOffset(relatively.offset)
|
return cronDateTime.toNearDateTime(dateTimeWithActualOffset) ?.toOffsetUnadjusted(offset) ?.toOffset(relatively.offset)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override suspend fun next(relatively: DateTime): DateTime? {
|
||||||
|
return next(relatively.toOffset(offset)) ?.utc
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun mergeCronDateTimeSchedulers(
|
internal fun mergeCronDateTimeSchedulers(
|
||||||
|
|||||||
@@ -101,13 +101,14 @@ internal fun NearDateTimeCalculatorDays(
|
|||||||
times: Array<Byte>
|
times: Array<Byte>
|
||||||
) = CommonNearDateTimeCalculator(
|
) = CommonNearDateTimeCalculator(
|
||||||
times,
|
times,
|
||||||
{ it.dayOfMonth.toByte() },
|
{ (it.dayOfMonth - 1).toByte() }, // index1, so, decrease
|
||||||
{ dateTime, newOne ->
|
{ dateTime, newOne ->
|
||||||
(if (newOne < dateTime.dayOfMonth) {
|
val dateTime = (if (newOne < dateTime.dayOfMonth) {
|
||||||
dateTime.plus(1.months)
|
dateTime.plus(1.months)
|
||||||
} else {
|
} else {
|
||||||
dateTime
|
dateTime
|
||||||
}).copy(
|
})
|
||||||
|
dateTime.copy(
|
||||||
dayOfMonth = min(dateTime.month.days(dateTime.year), newOne.toInt() + 1), // index1
|
dayOfMonth = min(dateTime.month.days(dateTime.year), newOne.toInt() + 1), // index1
|
||||||
hour = 0,
|
hour = 0,
|
||||||
minute = 0,
|
minute = 0,
|
||||||
@@ -121,7 +122,7 @@ internal fun NearDateTimeCalculatorMonths(
|
|||||||
times: Array<Byte>
|
times: Array<Byte>
|
||||||
) = CommonNearDateTimeCalculator(
|
) = CommonNearDateTimeCalculator(
|
||||||
times,
|
times,
|
||||||
{ it.dayOfMonth.toByte() },
|
{ it.month0.toByte() },
|
||||||
{ dateTime, newOne ->
|
{ dateTime, newOne ->
|
||||||
(if (newOne < dateTime.month0) {
|
(if (newOne < dateTime.month0) {
|
||||||
dateTime.plus(1.years)
|
dateTime.plus(1.years)
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package dev.inmo.krontab.utils.flows
|
||||||
|
|
||||||
|
import com.soywiz.klock.*
|
||||||
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
import kotlinx.coroutines.flow.filter
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun Flow<DateTimeTz>.filterSeconds(vararg seconds: Int) = filter { it.seconds in seconds }
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun Flow<DateTimeTz>.filterMinutes(vararg minutes: Int) = filter { it.minutes in minutes }
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun Flow<DateTimeTz>.filterHours(vararg hours: Int) = filter { it.hours in hours }
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun Flow<DateTimeTz>.filterDaysOfMonths(vararg daysOfMonths: Int) = filter { it.dayOfMonth in daysOfMonths }
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun Flow<DateTimeTz>.filterMonths(vararg months: Month) = filter { it.month in months }
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun Flow<DateTimeTz>.filterMonths0(vararg months: Int) = filter { it.month0 in months }
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun Flow<DateTimeTz>.filterMonths1(vararg months: Int) = filter { it.month1 in months }
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun Flow<DateTimeTz>.filterYears(year: Year) = filter { it.year == year }
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun Flow<DateTimeTz>.filterYears(vararg years: Int) = filter { it.yearInt in years }
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun Flow<DateTimeTz>.filterWeekDays(vararg weekDays: DayOfWeek) = filter { it.dayOfWeek in weekDays }
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun Flow<DateTimeTz>.filterWeekDays(vararg weekDays: Int) = filter { it.dayOfWeekInt in weekDays }
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package dev.inmo.krontab.utils.flows
|
||||||
|
|
||||||
|
import com.soywiz.klock.*
|
||||||
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun Flow<DateTimeTz>.onlyStartsOfMinutes() = filterSeconds(0)
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun Flow<DateTimeTz>.onlyStartsOfHours() = filterMinutes(0).onlyStartsOfMinutes()
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun Flow<DateTimeTz>.onlyStartsOfDays() = filterHours(0).onlyStartsOfHours()
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun Flow<DateTimeTz>.onlyStartsOfMondays() = filterWeekDays(DayOfWeek.Monday).onlyStartsOfDays()
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun Flow<DateTimeTz>.onlyStartsOfSundays() = filterWeekDays(DayOfWeek.Sunday).onlyStartsOfDays()
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun Flow<DateTimeTz>.onlyStartsOfMonths() = filterDaysOfMonths(1).onlyStartsOfDays()
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun Flow<DateTimeTz>.onlyStartsOfYears() = filterMonths(Month.January).onlyStartsOfMonths()
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package dev.inmo.krontab.utils
|
||||||
|
|
||||||
|
import com.soywiz.klock.DateTime
|
||||||
|
import com.soywiz.klock.days
|
||||||
|
import dev.inmo.krontab.buildSchedule
|
||||||
|
import kotlin.test.*
|
||||||
|
|
||||||
|
class CheckMonthsAndDaysCorrectWork {
|
||||||
|
@Test
|
||||||
|
fun checkMonthsAndDaysCorrectWork() {
|
||||||
|
val now = DateTime.now().startOfYear.startOfDay
|
||||||
|
for (i in 0 until now.year.days) {
|
||||||
|
val scheduleDateTime = (now + i.days)
|
||||||
|
runTest {
|
||||||
|
assertEquals(
|
||||||
|
scheduleDateTime,
|
||||||
|
buildSchedule("0 0 0 ${scheduleDateTime.dayOfMonth - 1} ${scheduleDateTime.month0}").next(now)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user