From 4a46cb1acb37e9e2d7f66f3b49400e0cdb89a5ee Mon Sep 17 00:00:00 2001 From: Peter Allen Webb Date: Mon, 15 Jul 2024 11:28:56 -0400 Subject: [PATCH] Draft fix of case-insensitive env vars for Windows. --- dbt_common/context.py | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/dbt_common/context.py b/dbt_common/context.py index d1775c55..99ef6655 100644 --- a/dbt_common/context.py +++ b/dbt_common/context.py @@ -1,13 +1,34 @@ +import os from contextvars import ContextVar, copy_context -from typing import List, Mapping, Optional +from typing import List, Mapping, Optional, Iterator from dbt_common.constants import PRIVATE_ENV_PREFIX, SECRET_ENV_PREFIX from dbt_common.record import Recorder +class CaseInsensitiveMapping(Mapping): + def __init__(self, env: Mapping[str, str]): + self._env = {k.casefold(): (k, v) for k, v in env.items()} + + def __getitem__(self, key: str) -> str: + return self._env[key.casefold()][1] + + def __len__(self) -> int: + return len(self._env) + + def __iter__(self) -> Iterator[str]: + for item in self._env.items(): + yield item[0] + + class InvocationContext: def __init__(self, env: Mapping[str, str]): - self._env = {k: v for k, v in env.items() if not k.startswith(PRIVATE_ENV_PREFIX)} + self._env: Mapping[str, str] + if os.name == "nt": + self._env = CaseInsensitiveMapping({k: v for k, v in env.items() if not k.startswith(PRIVATE_ENV_PREFIX)}) + else: + self._env = {k: v for k, v in env.items() if not k.startswith(PRIVATE_ENV_PREFIX)} + self._env_secrets: Optional[List[str]] = None self._env_private = {k: v for k, v in env.items() if k.startswith(PRIVATE_ENV_PREFIX)} self.recorder: Optional[Recorder] = None