diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7cd0c9b..611bd4c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,9 +1,9 @@ [versions] -agp = "8.10.1" -kotlin = "2.1.21" -kotlinxDatetime = "0.6.2" +agp = "8.12.3" +kotlin = "2.2.20" +kotlinxDatetime = "0.7.1" dokka = "2.0.0" -maven-publish = "0.33.0" +maven-publish = "0.34.0" [libraries] kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } diff --git a/kwhen/build.gradle.kts b/kwhen/build.gradle.kts index 34b833e..c23a6cb 100644 --- a/kwhen/build.gradle.kts +++ b/kwhen/build.gradle.kts @@ -61,7 +61,7 @@ tasks.withType { android { namespace = "io.github.pahinaa" - compileSdk = 35 + compileSdk = 36 defaultConfig { minSdk = 24 } @@ -74,7 +74,7 @@ android { * maven central user & pw should be auth token from maven central * */ mavenPublishing { - coordinates("io.github.pahinaa.kwhen", "kwhen", "0.1.0") + coordinates("io.github.pahinaa.kwhen", "kwhen", "0.1.1") publishToMavenCentral() signAllPublications() diff --git a/kwhen/src/commonMain/kotlin/ap/panini/kwhen/common/Controller.kt b/kwhen/src/commonMain/kotlin/ap/panini/kwhen/common/Controller.kt index 00509a1..32e32b5 100644 --- a/kwhen/src/commonMain/kotlin/ap/panini/kwhen/common/Controller.kt +++ b/kwhen/src/commonMain/kotlin/ap/panini/kwhen/common/Controller.kt @@ -7,9 +7,11 @@ import ap.panini.kwhen.configs.Config import ap.panini.kwhen.util.copy import kotlinx.datetime.DayOfWeek import kotlinx.datetime.LocalDateTime +import kotlinx.datetime.number import kotlinx.datetime.toInstant import kotlinx.datetime.toLocalDateTime import kotlin.time.Duration.Companion.hours +import kotlin.time.ExperimentalTime /** * Controller parses, merges, and finalizes times based on parsers and mergers given. @@ -177,9 +179,9 @@ abstract class Controller(open val config: Config) { TimeUnit.SECOND -> it.copy(second = date.startTime.second) TimeUnit.MINUTE -> it.copy(minute = date.startTime.minute) TimeUnit.HOUR -> it.copy(hour = date.startTime.hour) - TimeUnit.DAY -> it.copy(dayOfMonth = date.startTime.dayOfMonth) + TimeUnit.DAY -> it.copy(dayOfMonth = date.startTime.day) TimeUnit.WEEK -> { it } - TimeUnit.MONTH -> it.copy(monthNumber = date.startTime.monthNumber) + TimeUnit.MONTH -> it.copy(monthNumber = date.startTime.month.number) TimeUnit.YEAR -> it.copy(year = date.startTime.year) } } @@ -218,6 +220,7 @@ abstract class Controller(open val config: Config) { return allRet.reduce { l, r -> l union r }.sortedBy { it.range.first } } + @OptIn(ExperimentalTime::class) private fun dayOfWeek(start: LocalDateTime, day: DayOfWeek): LocalDateTime { var from = start.toInstant(config.timeZone) repeat(7) { diff --git a/kwhen/src/commonMain/kotlin/ap/panini/kwhen/configs/Config.kt b/kwhen/src/commonMain/kotlin/ap/panini/kwhen/configs/Config.kt index 9c1fe96..fba5f9d 100644 --- a/kwhen/src/commonMain/kotlin/ap/panini/kwhen/configs/Config.kt +++ b/kwhen/src/commonMain/kotlin/ap/panini/kwhen/configs/Config.kt @@ -4,14 +4,15 @@ import ap.panini.kwhen.DateTime import ap.panini.kwhen.DayOfWeek import ap.panini.kwhen.TimeUnit import ap.panini.kwhen.common.Controller -import kotlinx.datetime.Clock -import kotlinx.datetime.Instant +import kotlin.time.Instant import kotlinx.datetime.LocalDateTime import kotlinx.datetime.TimeZone import kotlinx.datetime.toLocalDateTime +import kotlin.time.Clock +import kotlin.time.ExperimentalTime // for things which are uncertain such as evening being somewhere between 6 - 9pm -sealed class Config( +sealed class Config @OptIn(ExperimentalTime::class) constructor( internal open val timeZone: TimeZone = TimeZone.currentSystemDefault(), internal open val relativeTo: Long = Clock.System.now().toEpochMilliseconds(), ) { @@ -51,12 +52,13 @@ sealed class Config( points ) + @OptIn(ExperimentalTime::class) internal fun now() = Instant.fromEpochMilliseconds(relativeTo).toLocalDateTime(timeZone) internal fun nowZeroed() = with(now()) { - LocalDateTime(year, month, dayOfMonth, hour, minute, 0, 0) + LocalDateTime(year, month, day, hour, minute, 0, 0) } diff --git a/kwhen/src/commonMain/kotlin/ap/panini/kwhen/configs/ENConfig.kt b/kwhen/src/commonMain/kotlin/ap/panini/kwhen/configs/ENConfig.kt index 975ed31..3ac22a2 100644 --- a/kwhen/src/commonMain/kotlin/ap/panini/kwhen/configs/ENConfig.kt +++ b/kwhen/src/commonMain/kotlin/ap/panini/kwhen/configs/ENConfig.kt @@ -2,8 +2,9 @@ package ap.panini.kwhen.configs import ap.panini.kwhen.common.Controller import ap.panini.kwhen.en.ENController -import kotlinx.datetime.Clock +import kotlin.time.Clock import kotlinx.datetime.TimeZone +import kotlin.time.ExperimentalTime /** * En config is a configuration file for english parsing @@ -15,7 +16,7 @@ import kotlinx.datetime.TimeZone * @property use24 if 24 hour time should be used or not * @constructor Create empty En config */ -data class ENConfig( +data class ENConfig @OptIn(ExperimentalTime::class) constructor( val evening: Int = 18, val morning: Int = 9, val afternoon: Int = 15, diff --git a/kwhen/src/commonMain/kotlin/ap/panini/kwhen/en/mergers/ENBegin.kt b/kwhen/src/commonMain/kotlin/ap/panini/kwhen/en/mergers/ENBegin.kt index 388ca2e..827d724 100644 --- a/kwhen/src/commonMain/kotlin/ap/panini/kwhen/en/mergers/ENBegin.kt +++ b/kwhen/src/commonMain/kotlin/ap/panini/kwhen/en/mergers/ENBegin.kt @@ -6,9 +6,11 @@ import ap.panini.kwhen.common.mergers.MergerWhitespaceTrimmed import ap.panini.kwhen.configs.ENConfig import ap.panini.kwhen.util.copy import ap.panini.kwhen.util.getDateTimeWithGeneral +import kotlinx.datetime.number import kotlinx.datetime.toInstant import kotlinx.datetime.toLocalDateTime import kotlin.time.Duration.Companion.days +import kotlin.time.ExperimentalTime /** * En begin finds words that come before times that can be merged with times @@ -23,6 +25,7 @@ internal class ENBegin(override val config: ENConfig) : MergerWhitespaceTrimmed( override val mergePrefixWithLeft: Boolean get() = true + @OptIn(ExperimentalTime::class) override fun onMatch( left: DateTime?, right: DateTime?, @@ -103,7 +106,7 @@ internal class ENBegin(override val config: ENConfig) : MergerWhitespaceTrimmed( val newTags = tempDate.tagsTimeStart.toMutableSet() newTags += TimeUnit.DAY - if (tempDate.startTime.monthNumber != newTime.monthNumber) { + if (tempDate.startTime.month.number != newTime.month.number) { newTags += TimeUnit.MONTH } diff --git a/kwhen/src/commonMain/kotlin/ap/panini/kwhen/en/parsers/ENNumericOrdinal.kt b/kwhen/src/commonMain/kotlin/ap/panini/kwhen/en/parsers/ENNumericOrdinal.kt index 3cadcd1..b6c1594 100644 --- a/kwhen/src/commonMain/kotlin/ap/panini/kwhen/en/parsers/ENNumericOrdinal.kt +++ b/kwhen/src/commonMain/kotlin/ap/panini/kwhen/en/parsers/ENNumericOrdinal.kt @@ -8,9 +8,11 @@ import ap.panini.kwhen.en.ordinal import ap.panini.kwhen.util.between31 import ap.panini.kwhen.util.copy import ap.panini.kwhen.util.matchAny +import kotlinx.datetime.number import kotlinx.datetime.toInstant import kotlinx.datetime.toLocalDateTime import kotlin.time.Duration.Companion.days +import kotlin.time.ExperimentalTime /** * En numeric ordinal finds time units that only have numbers in them @@ -21,6 +23,7 @@ import kotlin.time.Duration.Companion.days * @property config * @constructor Create empty E n numeric ordinal */ +@OptIn(ExperimentalTime::class) internal class ENNumericOrdinal(override val config: ENConfig) : ParserByWord(config) { override val matchPattern: Regex get() = "($between31)(?:(th|st|rd|nd)|(?:(?:\\s+|\\s*(:)\\s*)(\\d{1,2}))?\\s*([ap]\\.?m\\.?)?)|(${ordinal.keys.matchAny()})".toRegex() @@ -126,7 +129,7 @@ internal class ENNumericOrdinal(override val config: ENConfig) : ParserByWord(co val newTags = tempDate.tagsTimeStart.toMutableSet() newTags += TimeUnit.DAY - if (tempDate.startTime.monthNumber != newTime.monthNumber) { + if (tempDate.startTime.month.number != newTime.month.number) { newTags += TimeUnit.MONTH } diff --git a/kwhen/src/commonMain/kotlin/ap/panini/kwhen/util/Util.kt b/kwhen/src/commonMain/kotlin/ap/panini/kwhen/util/Util.kt index 559a371..1ea6056 100644 --- a/kwhen/src/commonMain/kotlin/ap/panini/kwhen/util/Util.kt +++ b/kwhen/src/commonMain/kotlin/ap/panini/kwhen/util/Util.kt @@ -7,6 +7,7 @@ import kotlinx.datetime.LocalDate import kotlinx.datetime.LocalDateTime import kotlinx.datetime.LocalTime import kotlinx.datetime.TimeZone +import kotlinx.datetime.number import kotlinx.datetime.plus import kotlinx.datetime.toInstant import kotlinx.datetime.toLocalDateTime @@ -14,6 +15,7 @@ import kotlin.time.Duration.Companion.days import kotlin.time.Duration.Companion.hours import kotlin.time.Duration.Companion.minutes import kotlin.time.Duration.Companion.seconds +import kotlin.time.ExperimentalTime /** * Match any takes a list and turns it into a regex that matches any item in that list @@ -37,6 +39,7 @@ internal val between31 = "(? { - time.copy(dayOfMonth = other.dayOfMonth) + time.copy(dayOfMonth = other.day) } TimeUnit.WEEK -> { @@ -134,7 +137,7 @@ internal fun LocalDateTime.mergeTime( } TimeUnit.MONTH -> { - time.copy(monthNumber = other.monthNumber) + time.copy(monthNumber = other.month.number) } TimeUnit.YEAR -> { @@ -181,6 +184,7 @@ internal fun getDateTimeWithGeneral( * @param relativeTo * @return */ +@OptIn(ExperimentalTime::class) private fun getDateTimeWithGeneral( generalNumber: Int, generalTag: TimeUnit, diff --git a/kwhen/src/commonTest/kotlin/RelativeTimesAndTimeZoneTest.kt b/kwhen/src/commonTest/kotlin/RelativeTimesAndTimeZoneTest.kt index 1a0a0ba..768a3d2 100644 --- a/kwhen/src/commonTest/kotlin/RelativeTimesAndTimeZoneTest.kt +++ b/kwhen/src/commonTest/kotlin/RelativeTimesAndTimeZoneTest.kt @@ -1,14 +1,15 @@ import ap.panini.kwhen.TimeParser -import ap.panini.kwhen.common.Parser import ap.panini.kwhen.configs.ENConfig import kotlinx.datetime.TimeZone import kotlinx.datetime.toInstant import kotlin.test.Test import kotlin.test.assertEquals import kotlin.time.Duration.Companion.days +import kotlin.time.ExperimentalTime class RelativeTimesAndTimeZoneTest { + @OptIn(ExperimentalTime::class) @Test fun relativeTimeTest() { TimeParser(