Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -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" }
Expand Down
4 changes: 2 additions & 2 deletions kwhen/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ tasks.withType<Test> {

android {
namespace = "io.github.pahinaa"
compileSdk = 35
compileSdk = 36
defaultConfig {
minSdk = 24
}
Expand All @@ -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()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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)
}
}
Expand Down Expand Up @@ -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) {
Expand Down
10 changes: 6 additions & 4 deletions kwhen/src/commonMain/kotlin/ap/panini/kwhen/configs/Config.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
) {
Expand Down Expand Up @@ -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)
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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?,
Expand Down Expand Up @@ -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
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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()
Expand Down Expand Up @@ -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
}

Expand Down
14 changes: 9 additions & 5 deletions kwhen/src/commonMain/kotlin/ap/panini/kwhen/util/Util.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,15 @@ 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
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
Expand All @@ -37,6 +39,7 @@ internal val between31 = "(?<!\\d)(?:0?[1-9]|[12][0-9]|3[01])(?!\\d)".toRegex()
* @param second
* @return The copied date time with the given modifications
*/
@OptIn(ExperimentalTime::class)
internal fun LocalDateTime.copy(
year: Int? = null,
monthNumber: Int? = null,
Expand All @@ -52,16 +55,16 @@ internal fun LocalDateTime.copy(

val mHour = hour ?: this.hour

val mDayOfMonth = (dayOfMonth ?: this.dayOfMonth) - 1
val mDayOfMonth = (dayOfMonth ?: day) - 1

val mYear = year ?: this.year

val mMonthNumber = monthNumber ?: this.monthNumber
val mMonthNumber = monthNumber ?: month.number

// gets the month and year info
var inst = LocalDateTime(
mYear + (mMonthNumber - 1) / 12,
if (monthNumber == null) this.monthNumber else ((monthNumber - 1) % 12 + 1),
if (monthNumber == null) month.number else ((monthNumber - 1) % 12 + 1),
1, // month can't be 0
0,
0,
Expand Down Expand Up @@ -126,15 +129,15 @@ internal fun LocalDateTime.mergeTime(
}

TimeUnit.DAY -> {
time.copy(dayOfMonth = other.dayOfMonth)
time.copy(dayOfMonth = other.day)
}

TimeUnit.WEEK -> {
time // this shouldn't do much?
}

TimeUnit.MONTH -> {
time.copy(monthNumber = other.monthNumber)
time.copy(monthNumber = other.month.number)
}

TimeUnit.YEAR -> {
Expand Down Expand Up @@ -181,6 +184,7 @@ internal fun getDateTimeWithGeneral(
* @param relativeTo
* @return
*/
@OptIn(ExperimentalTime::class)
private fun getDateTimeWithGeneral(
generalNumber: Int,
generalTag: TimeUnit,
Expand Down
3 changes: 2 additions & 1 deletion kwhen/src/commonTest/kotlin/RelativeTimesAndTimeZoneTest.kt
Original file line number Diff line number Diff line change
@@ -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(
Expand Down