From 09ab60319b159b899264b1387aac9e910b521109 Mon Sep 17 00:00:00 2001 From: Jon Gao Date: Thu, 6 Nov 2025 23:39:56 +0000 Subject: [PATCH 1/2] Implementing case insensitive checks for format options --- .../src/utils/formatmanager.py | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/contrib/templates/file-push/template/{{.catalog_name}}.{{.schema_name}}/src/utils/formatmanager.py b/contrib/templates/file-push/template/{{.catalog_name}}.{{.schema_name}}/src/utils/formatmanager.py index 368109e..15bbc59 100644 --- a/contrib/templates/file-push/template/{{.catalog_name}}.{{.schema_name}}/src/utils/formatmanager.py +++ b/contrib/templates/file-push/template/{{.catalog_name}}.{{.schema_name}}/src/utils/formatmanager.py @@ -39,26 +39,33 @@ def get_userfacing_options(self) -> dict[str, str]: def validate_user_options(self, options: dict[str, str]) -> None: allowed = set(self.get_userfacing_options()) - illegal = set(options) - allowed + # Create lowercase version of allowed options for case-insensitive comparison + allowed_lower = {key.lower() for key in allowed} + + # Check for illegal options (case-insensitive) + illegal = [key for key in options if key.lower() not in allowed_lower] + if illegal: raise ValueError( f"Unsupported or protected options: {sorted(illegal)}. " f"Allowed user options: {sorted(allowed)}" ) - def get_modified_options(self, options: dict[str, str]) -> dict[str, str]: - self.validate_user_options(options) - defaults = self.get_userfacing_options() - return {k: v for k, v in options.items() if k in defaults and v != defaults[k]} - def get_merged_options( self, options: dict[str, str], table_name: str, is_placeholder: bool = False ) -> dict[str, str]: self.validate_user_options(options) defaults = {opt.key: opt.value for opt in self.options} + # Create case-insensitive mapping + defaults_lower = {key.lower(): key for key in defaults} merged = defaults.copy() - merged.update({k: v for k, v in options.items() if k in defaults}) + # Merge user options using case-insensitive matching + for user_key, user_value in options.items(): + lower_key = user_key.lower() + if lower_key in defaults_lower: + canonical_key = defaults_lower[lower_key] + merged[canonical_key] = user_value # Do not specify schema evolution mode in placeholder if is_placeholder: From 1008e4cc1bfd68362c0de3a8a2e0c47b67b7755f Mon Sep 17 00:00:00 2001 From: Jon Gao Date: Tue, 11 Nov 2025 19:25:41 +0000 Subject: [PATCH 2/2] Fixing format issues with whitespace --- .../src/utils/formatmanager.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/templates/file-push/template/{{.catalog_name}}.{{.schema_name}}/src/utils/formatmanager.py b/contrib/templates/file-push/template/{{.catalog_name}}.{{.schema_name}}/src/utils/formatmanager.py index 15bbc59..4680cf0 100644 --- a/contrib/templates/file-push/template/{{.catalog_name}}.{{.schema_name}}/src/utils/formatmanager.py +++ b/contrib/templates/file-push/template/{{.catalog_name}}.{{.schema_name}}/src/utils/formatmanager.py @@ -41,10 +41,10 @@ def validate_user_options(self, options: dict[str, str]) -> None: allowed = set(self.get_userfacing_options()) # Create lowercase version of allowed options for case-insensitive comparison allowed_lower = {key.lower() for key in allowed} - + # Check for illegal options (case-insensitive) illegal = [key for key in options if key.lower() not in allowed_lower] - + if illegal: raise ValueError( f"Unsupported or protected options: {sorted(illegal)}. "