From a36cef32ede45d1c06e97c35056c37e848da8b9a Mon Sep 17 00:00:00 2001 From: Quigley Malcolm Date: Fri, 2 Feb 2024 13:58:09 -0800 Subject: [PATCH] Remove definition of `Mergeable` from dbt/contracts/util Although we've removed the definition of `Mergeable` we've ensured the import paths are still available. We do this because this is under `contracts`, and the sudden disappearance from the import path might cause issues for community members using dbt-core as a library. Ideally we'd define a `Mergeable` class here that inherits the `dbt-common` definition and raise a deprecation warning on instantiation. However, we don't have an established strategy to do so. --- core/dbt/contracts/util.py | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/core/dbt/contracts/util.py b/core/dbt/contracts/util.py index 158dbac4642..b4029f9897a 100644 --- a/core/dbt/contracts/util.py +++ b/core/dbt/contracts/util.py @@ -1,8 +1,9 @@ -import dataclasses from typing import List, Any, Tuple from dbt_common.dataclass_schema import ValidatedStringMixin, ValidationError -from dbt_common.contracts.util import Replaceable + +# Leave imports of `Mergeable` and `Replaceable` to preserve import paths +from dbt_common.contracts.util import Mergeable, Replaceable # noqa:F401 SourceKey = Tuple[str, str] @@ -24,22 +25,6 @@ class Foo: return [] -class Mergeable(Replaceable): - def merged(self, *args): - """Perform a shallow merge, where the last non-None write wins. This is - intended to merge dataclasses that are a collection of optional values. - """ - replacements = {} - cls = type(self) - for arg in args: - for field in dataclasses.fields(cls): - value = getattr(arg, field.name) - if value is not None: - replacements[field.name] = value - - return self.replace(**replacements) - - class Identifier(ValidatedStringMixin): """Our definition of a valid Identifier is the same as what's valid for an unquoted database table name.