Compare commits

..

2 Commits

Author SHA1 Message Date
8a86f0d0b2 chore: Release
All checks were successful
Continuous integration / Check (push) Successful in 1m8s
Continuous integration / Test Suite (push) Successful in 3m35s
Continuous integration / Rustfmt (push) Successful in 55s
Continuous integration / Trunk (push) Successful in 2m4s
Continuous integration / build (push) Successful in 1m51s
Continuous integration / Disallow unused dependencies (push) Successful in 5m1s
2026-01-04 11:08:22 -08:00
eab4986fd3 server: fix date extraction and unit tests 2026-01-04 11:08:03 -08:00
4 changed files with 52 additions and 54 deletions

78
Cargo.lock generated
View File

@@ -183,11 +183,11 @@ checksum = "71938f30533e4d95a6d17aa530939da3842c2ab6f4f84b9dae68447e4129f74a"
[[package]] [[package]]
name = "askama" name = "askama"
version = "0.15.1" version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bb7125972258312e79827b60c9eb93938334100245081cf701a2dee981b17427" checksum = "f75363874b771be265f4ffe307ca705ef6f3baa19011c149da8674a87f1b75c4"
dependencies = [ dependencies = [
"askama_macros", "askama_derive",
"itoa 1.0.17", "itoa 1.0.17",
"percent-encoding", "percent-encoding",
"serde", "serde",
@@ -196,9 +196,9 @@ dependencies = [
[[package]] [[package]]
name = "askama_derive" name = "askama_derive"
version = "0.15.1" version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ba5e7259a1580c61571e3116ebaaa01e3c001b2132b17c4cc5c70780ca3e994" checksum = "129397200fe83088e8a68407a8e2b1f826cf0086b21ccdb866a722c8bcd3a94f"
dependencies = [ dependencies = [
"askama_parser", "askama_parser",
"basic-toml", "basic-toml",
@@ -211,25 +211,15 @@ dependencies = [
"syn 2.0.111", "syn 2.0.111",
] ]
[[package]]
name = "askama_macros"
version = "0.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "236ce20b77cb13506eaf5024899f4af6e12e8825f390bd943c4c37fd8f322e46"
dependencies = [
"askama_derive",
]
[[package]] [[package]]
name = "askama_parser" name = "askama_parser"
version = "0.15.1" version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f3c63392767bb2df6aa65a6e1e3b80fd89bb7af6d58359b924c0695620f1512e" checksum = "d6ab5630b3d5eaf232620167977f95eb51f3432fc76852328774afbd242d4358"
dependencies = [ dependencies = [
"rustc-hash", "memchr",
"serde", "serde",
"serde_derive", "serde_derive",
"unicode-ident",
"winnow", "winnow",
] ]
@@ -3085,6 +3075,20 @@ dependencies = [
[[package]] [[package]]
name = "letterbox-notmuch" name = "letterbox-notmuch"
version = "0.17.55" version = "0.17.55"
source = "sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/"
checksum = "e4d1d65ae37e0b9efbee0daf341e7e5ea2db8ae78e4ea429359c671163636283"
dependencies = [
"log",
"mailparse",
"serde",
"serde_json",
"thiserror 2.0.17",
"tracing",
]
[[package]]
name = "letterbox-notmuch"
version = "0.17.56"
dependencies = [ dependencies = [
"itertools", "itertools",
"log", "log",
@@ -3097,28 +3101,14 @@ dependencies = [
"tracing", "tracing",
] ]
[[package]]
name = "letterbox-notmuch"
version = "0.17.55"
source = "sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/"
checksum = "e4d1d65ae37e0b9efbee0daf341e7e5ea2db8ae78e4ea429359c671163636283"
dependencies = [
"log",
"mailparse",
"serde",
"serde_json",
"thiserror 2.0.17",
"tracing",
]
[[package]] [[package]]
name = "letterbox-procmail2notmuch" name = "letterbox-procmail2notmuch"
version = "0.17.55" version = "0.17.56"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"clap", "clap",
"letterbox-notmuch 0.17.55 (sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/)", "letterbox-notmuch 0.17.55",
"letterbox-shared 0.17.55 (sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/)", "letterbox-shared 0.17.55",
"serde", "serde",
"sqlx", "sqlx",
"tokio 1.48.0", "tokio 1.48.0",
@@ -3126,7 +3116,7 @@ dependencies = [
[[package]] [[package]]
name = "letterbox-server" name = "letterbox-server"
version = "0.17.55" version = "0.17.56"
dependencies = [ dependencies = [
"ammonia", "ammonia",
"anyhow", "anyhow",
@@ -3149,8 +3139,8 @@ dependencies = [
"html-escape", "html-escape",
"html2text", "html2text",
"ical", "ical",
"letterbox-notmuch 0.17.55", "letterbox-notmuch 0.17.56",
"letterbox-shared 0.17.55", "letterbox-shared 0.17.56",
"linkify", "linkify",
"lol_html", "lol_html",
"mailparse", "mailparse",
@@ -3177,6 +3167,8 @@ dependencies = [
[[package]] [[package]]
name = "letterbox-shared" name = "letterbox-shared"
version = "0.17.55" version = "0.17.55"
source = "sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/"
checksum = "efcc3a59edbda7b3a9ac419bafafd5da8fea7a757fcffd5bfd88b28fba1ad97f"
dependencies = [ dependencies = [
"build-info", "build-info",
"letterbox-notmuch 0.17.55", "letterbox-notmuch 0.17.55",
@@ -3189,12 +3181,10 @@ dependencies = [
[[package]] [[package]]
name = "letterbox-shared" name = "letterbox-shared"
version = "0.17.55" version = "0.17.56"
source = "sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/"
checksum = "efcc3a59edbda7b3a9ac419bafafd5da8fea7a757fcffd5bfd88b28fba1ad97f"
dependencies = [ dependencies = [
"build-info", "build-info",
"letterbox-notmuch 0.17.55 (sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/)", "letterbox-notmuch 0.17.56",
"regex", "regex",
"serde", "serde",
"sqlx", "sqlx",
@@ -3204,7 +3194,7 @@ dependencies = [
[[package]] [[package]]
name = "letterbox-web" name = "letterbox-web"
version = "0.17.55" version = "0.17.56"
dependencies = [ dependencies = [
"build-info", "build-info",
"build-info-build", "build-info-build",
@@ -3216,7 +3206,7 @@ dependencies = [
"graphql_client", "graphql_client",
"human_format", "human_format",
"itertools", "itertools",
"letterbox-shared 0.17.55", "letterbox-shared 0.17.56",
"log", "log",
"seed", "seed",
"seed_hooks", "seed_hooks",

View File

@@ -8,7 +8,7 @@ authors = ["Bill Thiede <git@xinu.tv>"]
edition = "2021" edition = "2021"
license = "UNLICENSED" license = "UNLICENSED"
publish = ["xinu"] publish = ["xinu"]
version = "0.17.55" version = "0.17.56"
repository = "https://git.z.xinu.tv/wathiede/letterbox" repository = "https://git.z.xinu.tv/wathiede/letterbox"
[profile.dev] [profile.dev]

View File

@@ -16,7 +16,7 @@ chrono-tz = "0.10"
html2text = "0.16" html2text = "0.16"
ammonia = "4.1.0" ammonia = "4.1.0"
anyhow = "1.0.98" anyhow = "1.0.98"
askama = { version = "0.15.0", features = ["derive"] } askama = { version = "0.14.0", features = ["derive"] }
async-graphql = { version = "7", features = ["log", "chrono"] } async-graphql = { version = "7", features = ["log", "chrono"] }
async-graphql-axum = "7.0.16" async-graphql-axum = "7.0.16"
async-trait = "0.1.88" async-trait = "0.1.88"

View File

@@ -195,8 +195,16 @@ pub fn extract_calendar_metadata_from_mail(
} }
} }
if let (Some(sm), Some(em)) = (month_num(start_month), month_num(end_month)) { if let (Some(sm), Some(em)) = (month_num(start_month), month_num(end_month)) {
let current_year = chrono::Local::now().year().to_string(); // If start month is later in calendar year than end month, start is in previous year
let start = format!("{}{}{}", current_year, sm, format!("{:0>2}", start_day)); let sm_num: u32 = sm.parse().unwrap_or(1);
let em_num: u32 = em.parse().unwrap_or(1);
let end_year = year.parse::<i32>().unwrap_or_else(|_| chrono::Local::now().year());
let start_year: i32 = if sm_num > em_num {
end_year - 1
} else {
end_year
};
let start = format!("{}{}{}", start_year, sm, format!("{:0>2}", start_day));
let mut end_date_val = chrono::NaiveDate::parse_from_str(&format!("{}-{}-{}", year, em, format!("{:0>2}", end_day)), "%Y-%m-%d").ok(); let mut end_date_val = chrono::NaiveDate::parse_from_str(&format!("{}-{}-{}", year, em, format!("{:0>2}", end_day)), "%Y-%m-%d").ok();
if let Some(d) = end_date_val.as_mut() { if let Some(d) = end_date_val.as_mut() {
*d = d.succ_opt().unwrap_or(*d); *d = d.succ_opt().unwrap_or(*d);
@@ -2307,8 +2315,8 @@ mod tests {
Some("calendar-notification@google.com".to_string()) Some("calendar-notification@google.com".to_string())
); );
// Dates: from subject, Thu Sep 11 to Fri Jan 30, 2026 // Dates: from subject, Thu Sep 11 to Fri Jan 30, 2026
let current_year = chrono::Local::now().year(); // Start date is Sep 11, 2025 (one year before end since Sep > Jan)
assert_eq!(meta.start_date, Some(format!("{}0911", current_year))); assert_eq!(meta.start_date, Some("20250911".to_string()));
assert_eq!(meta.end_date, Some("20260131".to_string())); assert_eq!(meta.end_date, Some("20260131".to_string()));
} }
#[test] #[test]
@@ -2408,8 +2416,8 @@ mod tests {
Some("calendar-notification@google.com".to_string()) Some("calendar-notification@google.com".to_string())
); );
// Dates: from subject, Thu Sep 11 to Fri Jan 30, 2026 // Dates: from subject, Thu Sep 11 to Fri Jan 30, 2026
let current_year = chrono::Local::now().year(); // Start date is Sep 11, 2025 (one year before end since Sep > Jan)
assert_eq!(meta.start_date, Some(format!("{}0911", current_year))); assert_eq!(meta.start_date, Some("20250911".to_string()));
assert_eq!(meta.end_date, Some("20260131".to_string())); assert_eq!(meta.end_date, Some("20260131".to_string()));
// Debug: print the rendered HTML for inspection // Debug: print the rendered HTML for inspection
if let Some(ref html) = meta.body_html { if let Some(ref html) = meta.body_html {
@@ -2442,8 +2450,8 @@ mod tests {
Some("calendar-notification@google.com".to_string()) Some("calendar-notification@google.com".to_string())
); );
// Assert that the start and end dates are present // Assert that the start and end dates are present
let current_year = chrono::Local::now().year(); // Start date is Sep 11, 2025 (one year before end since Sep > Jan)
assert_eq!(meta.start_date, Some(format!("{}0911", current_year))); assert_eq!(meta.start_date, Some("20250911".to_string()));
assert_eq!(meta.end_date, Some("20260131".to_string())); assert_eq!(meta.end_date, Some("20260131".to_string()));
// Assert that the HTML body contains recurrence info // Assert that the HTML body contains recurrence info
if let Some(ref html) = meta.body_html { if let Some(ref html) = meta.body_html {