Skip to content

Commit e7fa87a

Browse files
authored
Implementing case insensitive checks for format options (#122)
cloudFile format options are case insensitive, so allowlisted/denylisted options should also be matched case insensitive
1 parent 903f8cd commit e7fa87a

File tree

1 file changed

+14
-7
lines changed
  • contrib/templates/file-push/template/{{.catalog_name}}.{{.schema_name}}/src/utils

1 file changed

+14
-7
lines changed

contrib/templates/file-push/template/{{.catalog_name}}.{{.schema_name}}/src/utils/formatmanager.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,26 +39,33 @@ def get_userfacing_options(self) -> dict[str, str]:
3939

4040
def validate_user_options(self, options: dict[str, str]) -> None:
4141
allowed = set(self.get_userfacing_options())
42-
illegal = set(options) - allowed
42+
# Create lowercase version of allowed options for case-insensitive comparison
43+
allowed_lower = {key.lower() for key in allowed}
44+
45+
# Check for illegal options (case-insensitive)
46+
illegal = [key for key in options if key.lower() not in allowed_lower]
47+
4348
if illegal:
4449
raise ValueError(
4550
f"Unsupported or protected options: {sorted(illegal)}. "
4651
f"Allowed user options: {sorted(allowed)}"
4752
)
4853

49-
def get_modified_options(self, options: dict[str, str]) -> dict[str, str]:
50-
self.validate_user_options(options)
51-
defaults = self.get_userfacing_options()
52-
return {k: v for k, v in options.items() if k in defaults and v != defaults[k]}
53-
5454
def get_merged_options(
5555
self, options: dict[str, str], table_name: str, is_placeholder: bool = False
5656
) -> dict[str, str]:
5757
self.validate_user_options(options)
5858
defaults = {opt.key: opt.value for opt in self.options}
59+
# Create case-insensitive mapping
60+
defaults_lower = {key.lower(): key for key in defaults}
5961

6062
merged = defaults.copy()
61-
merged.update({k: v for k, v in options.items() if k in defaults})
63+
# Merge user options using case-insensitive matching
64+
for user_key, user_value in options.items():
65+
lower_key = user_key.lower()
66+
if lower_key in defaults_lower:
67+
canonical_key = defaults_lower[lower_key]
68+
merged[canonical_key] = user_value
6269

6370
# Do not specify schema evolution mode in placeholder
6471
if is_placeholder:

0 commit comments

Comments
 (0)