From 7fda2a115f93f6fc92dd3368d484739a684f55db Mon Sep 17 00:00:00 2001 From: Tai Le Manh Date: Wed, 4 Jun 2025 16:36:05 +0700 Subject: [PATCH 1/2] Make modules.pytz.timezone compatible with dbt-core --- crates/dbt-jinja/minijinja-contrib/Cargo.toml | 2 +- .../minijinja-contrib/src/modules/pytz.rs | 42 ++++++++++++++++++- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/crates/dbt-jinja/minijinja-contrib/Cargo.toml b/crates/dbt-jinja/minijinja-contrib/Cargo.toml index af9f4a34..90b19cfa 100644 --- a/crates/dbt-jinja/minijinja-contrib/Cargo.toml +++ b/crates/dbt-jinja/minijinja-contrib/Cargo.toml @@ -31,7 +31,7 @@ unicode_wordwrap = [ [dependencies] chrono = { version = "0.4.26", features = ["serde"] } -chrono-tz = { version = "0.10.1" } +chrono-tz = { version = "0.10.1" , features = ["case-insensitive"] } fancy-regex = { workspace = true } iana-time-zone = { workspace = true } minijinja = { workspace = true } diff --git a/crates/dbt-jinja/minijinja-contrib/src/modules/pytz.rs b/crates/dbt-jinja/minijinja-contrib/src/modules/pytz.rs index 6b9b5b90..adabcd13 100644 --- a/crates/dbt-jinja/minijinja-contrib/src/modules/pytz.rs +++ b/crates/dbt-jinja/minijinja-contrib/src/modules/pytz.rs @@ -3,7 +3,6 @@ use chrono_tz::Tz; use minijinja::{Error, ErrorKind, Value}; use std::collections::BTreeMap; use std::fmt; -use std::str::FromStr; use std::sync::Arc; /// A Python-like "pytz" timezone object that wraps a `chrono_tz::Tz`. @@ -81,7 +80,7 @@ fn timezone(args: &[Value]) -> Result { })?; // Try to parse it as a Chrono Tz. - match Tz::from_str(tz_name) { + match Tz::from_str_insensitive(tz_name) { Ok(tz) => Ok(Value::from_object(PytzTimezone::new(tz))), Err(_) => Err(Error::new( ErrorKind::InvalidArgument, @@ -116,3 +115,42 @@ impl minijinja::value::Object for PytzTimezone { write!(f, "{}", self.tz) } } + +#[cfg(test)] +mod tests { + use crate::modules::pytz::{timezone, PytzTimezone}; + use minijinja::Value; + use chrono_tz::Tz; + + #[test] + fn test_valid_timezone_utc() { + let args = vec![Value::from("UTC")]; + let result = timezone(&args); + assert!(result.is_ok()); + + let actual = result.unwrap(); + let expected = Value::from_object(PytzTimezone::new(chrono_tz::UTC)); + assert_eq!(actual, expected); + } + + #[test] + fn test_valid_timezone_case_insensitive() { + let args = vec![Value::from("asia/ho_chi_minh")]; + let result = timezone(&args); + assert!(result.is_ok()); + + let actual = result.unwrap(); + let expected = Value::from_object(PytzTimezone::new(Tz::Asia__Ho_Chi_Minh)); + assert_eq!(actual, expected); + } + + #[test] + fn test_invalid_timezone() { + let args = vec![Value::from("Invalid/Zone")]; + let result = timezone(&args); + assert!(result.is_err()); + + let err = result.unwrap_err(); + assert!(err.to_string().contains("Invalid timezone name")); + } +} From 39414bc8f133e4c9751e4855510f29c72ebc6024 Mon Sep 17 00:00:00 2001 From: Tai Le Manh Date: Mon, 14 Jul 2025 09:30:54 +0700 Subject: [PATCH 2/2] Update cargo.toml of minijinja-contrib --- crates/dbt-jinja/minijinja-contrib/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/dbt-jinja/minijinja-contrib/Cargo.toml b/crates/dbt-jinja/minijinja-contrib/Cargo.toml index 7ce2709e..25e6332c 100644 --- a/crates/dbt-jinja/minijinja-contrib/Cargo.toml +++ b/crates/dbt-jinja/minijinja-contrib/Cargo.toml @@ -31,7 +31,7 @@ unicode_wordwrap = [ [dependencies] chrono = { version = "0.4.26", features = ["serde"] } -chrono-tz = { workspace = true } +chrono-tz = { workspace = true , features = ["case-insensitive"]} fancy-regex = { workspace = true } iana-time-zone = { workspace = true } minijinja = { workspace = true }