diff --git a/.changes/unreleased/Under the Hood-20240104-135849.yaml b/.changes/unreleased/Under the Hood-20240104-135849.yaml new file mode 100644 index 00000000000..080016db8fb --- /dev/null +++ b/.changes/unreleased/Under the Hood-20240104-135849.yaml @@ -0,0 +1,6 @@ +kind: Under the Hood +body: Remove usage of dbt.adapters.factory in dbt/common +time: 2024-01-04T13:58:49.221966-05:00 +custom: + Author: michelleark + Issue: "9334" diff --git a/core/dbt/common/contracts/config/base.py b/core/dbt/common/contracts/config/base.py index 47bcfe7489a..d55e41ddec7 100644 --- a/core/dbt/common/contracts/config/base.py +++ b/core/dbt/common/contracts/config/base.py @@ -1,7 +1,10 @@ +# necessary for annotating constructors +from __future__ import annotations + from dataclasses import dataclass, Field from itertools import chain -from typing import Callable, Dict, Any, List, TypeVar +from typing import Callable, Dict, Any, List, TypeVar, Type from dbt.common.contracts.config.metadata import Metadata from dbt.common.exceptions import CompilationError, DbtInternalError @@ -140,21 +143,18 @@ def _merge_dicts(cls, src: Dict[str, Any], data: Dict[str, Any]) -> Dict[str, An ) return result - def update_from(self: T, data: Dict[str, Any], adapter_type: str, validate: bool = True) -> T: + def update_from( + self: T, data: Dict[str, Any], config_cls: Type[BaseConfig], validate: bool = True + ) -> T: """Given a dict of keys, update the current config from them, validate it, and return a new config with the updated values """ - # sadly, this is a circular import - from dbt.adapters.factory import get_config_class_by_name - dct = self.to_dict(omit_none=False) - adapter_config_cls = get_config_class_by_name(adapter_type) - self_merged = self._merge_dicts(dct, data) dct.update(self_merged) - adapter_merged = adapter_config_cls._merge_dicts(dct, data) + adapter_merged = config_cls._merge_dicts(dct, data) dct.update(adapter_merged) # any remaining fields must be "clobber" diff --git a/core/dbt/context/context_config.py b/core/dbt/context/context_config.py index bec2f16e4e4..03994dcb0d0 100644 --- a/core/dbt/context/context_config.py +++ b/core/dbt/context/context_config.py @@ -3,6 +3,7 @@ from dataclasses import dataclass from typing import List, Iterator, Dict, Any, TypeVar, Generic, Optional +from dbt.adapters.factory import get_config_class_by_name from dbt.config import RuntimeConfig, Project, IsFQNResource from dbt.contracts.graph.model_config import get_config_for from dbt.common.contracts.config.base import BaseConfig, _listify @@ -199,9 +200,11 @@ def initial_result(self, resource_type: NodeType, base: bool) -> C: def _update_from_config(self, result: C, partial: Dict[str, Any], validate: bool = False) -> C: translated = self._active_project.credentials.translate_aliases(partial) translated = self.translate_hook_names(translated) - updated = result.update_from( - translated, self._active_project.credentials.type, validate=validate - ) + + adapter_type = self._active_project.credentials.type + adapter_config_cls = get_config_class_by_name(adapter_type) + + updated = result.update_from(translated, adapter_config_cls, validate=validate) return updated def translate_hook_names(self, project_dict):