From b1a310960edfe9835c72cda2c941d00ef49c0559 Mon Sep 17 00:00:00 2001 From: Peter Allen Webb Date: Fri, 10 Nov 2023 16:37:13 -0500 Subject: [PATCH 1/3] Move constraints to dbt.common --- core/dbt/adapters/base/impl.py | 2 +- core/dbt/common/constraints.py | 43 +++++++++++++++++++ core/dbt/contracts/graph/nodes.py | 40 +---------------- core/dbt/parser/common.py | 8 +--- core/dbt/parser/schemas.py | 3 +- .../postgres/dbt/adapters/postgres/impl.py | 2 +- 6 files changed, 49 insertions(+), 49 deletions(-) create mode 100644 core/dbt/common/constraints.py diff --git a/core/dbt/adapters/base/impl.py b/core/dbt/adapters/base/impl.py index 00bd08cebeb..34e6cb63eb1 100644 --- a/core/dbt/adapters/base/impl.py +++ b/core/dbt/adapters/base/impl.py @@ -23,7 +23,7 @@ from multiprocessing.context import SpawnContext from dbt.adapters.capability import Capability, CapabilityDict -from dbt.contracts.graph.nodes import ColumnLevelConstraint, ConstraintType, ModelLevelConstraint +from dbt.common.constraints import ColumnLevelConstraint, ConstraintType, ModelLevelConstraint import agate import pytz diff --git a/core/dbt/common/constraints.py b/core/dbt/common/constraints.py new file mode 100644 index 00000000000..1c8643b86af --- /dev/null +++ b/core/dbt/common/constraints.py @@ -0,0 +1,43 @@ +from dataclasses import dataclass, field +from enum import Enum +from typing import Optional, List + +from dbt.common.dataclass_schema import dbtClassMixin + + +class ConstraintType(str, Enum): + check = "check" + not_null = "not_null" + unique = "unique" + primary_key = "primary_key" + foreign_key = "foreign_key" + custom = "custom" + + @classmethod + def is_valid(cls, item) -> bool: + try: + cls(item) + except ValueError: + return False + return True + + +@dataclass +class ColumnLevelConstraint(dbtClassMixin): + type: ConstraintType + name: Optional[str] = None + # expression is a user-provided field that will depend on the constraint type. + # It could be a predicate (check type), or a sequence sql keywords (e.g. unique type), + # so the vague naming of 'expression' is intended to capture this range. + expression: Optional[str] = None + warn_unenforced: bool = ( + True # Warn if constraint cannot be enforced by platform but will be in DDL + ) + warn_unsupported: bool = ( + True # Warn if constraint is not supported by the platform and won't be in DDL + ) + + +@dataclass +class ModelLevelConstraint(ColumnLevelConstraint): + columns: List[str] = field(default_factory=list) diff --git a/core/dbt/contracts/graph/nodes.py b/core/dbt/contracts/graph/nodes.py index 62f491c2894..180692a81eb 100644 --- a/core/dbt/contracts/graph/nodes.py +++ b/core/dbt/contracts/graph/nodes.py @@ -2,12 +2,12 @@ from datetime import datetime import time from dataclasses import dataclass, field -from enum import Enum import hashlib from mashumaro.types import SerializableType from typing import Optional, Union, List, Dict, Any, Sequence, Tuple, Iterator, Literal +from dbt.common.constraints import ColumnLevelConstraint, ConstraintType, ModelLevelConstraint from dbt.common.dataclass_schema import dbtClassMixin, ExtensibleDbtClassMixin from dbt.clients.system import write_file @@ -178,44 +178,6 @@ def keyword_args(self) -> Dict[str, Optional[NodeVersion]]: return {} -class ConstraintType(str, Enum): - check = "check" - not_null = "not_null" - unique = "unique" - primary_key = "primary_key" - foreign_key = "foreign_key" - custom = "custom" - - @classmethod - def is_valid(cls, item): - try: - cls(item) - except ValueError: - return False - return True - - -@dataclass -class ColumnLevelConstraint(dbtClassMixin): - type: ConstraintType - name: Optional[str] = None - # expression is a user-provided field that will depend on the constraint type. - # It could be a predicate (check type), or a sequence sql keywords (e.g. unique type), - # so the vague naming of 'expression' is intended to capture this range. - expression: Optional[str] = None - warn_unenforced: bool = ( - True # Warn if constraint cannot be enforced by platform but will be in DDL - ) - warn_unsupported: bool = ( - True # Warn if constraint is not supported by the platform and won't be in DDL - ) - - -@dataclass -class ModelLevelConstraint(ColumnLevelConstraint): - columns: List[str] = field(default_factory=list) - - @dataclass class ColumnInfo(AdditionalPropertiesMixin, ExtensibleDbtClassMixin, Replaceable): """Used in all ManifestNodes and SourceDefinition""" diff --git a/core/dbt/parser/common.py b/core/dbt/parser/common.py index 8947eea1364..dda54b34c38 100644 --- a/core/dbt/parser/common.py +++ b/core/dbt/parser/common.py @@ -1,3 +1,4 @@ +from dbt.common.constraints import ColumnLevelConstraint, ConstraintType from dbt.contracts.graph.unparsed import ( HasColumnProps, UnparsedColumn, @@ -8,12 +9,7 @@ UnparsedModelUpdate, ) from dbt.contracts.graph.unparsed import NodeVersion, HasColumnTests, HasColumnDocs -from dbt.contracts.graph.nodes import ( - UnpatchedSourceDefinition, - ColumnInfo, - ColumnLevelConstraint, - ConstraintType, -) +from dbt.contracts.graph.nodes import UnpatchedSourceDefinition, ColumnInfo from dbt.parser.search import FileBlock from typing import List, Dict, Any, TypeVar, Generic, Union, Optional from dataclasses import dataclass diff --git a/core/dbt/parser/schemas.py b/core/dbt/parser/schemas.py index 391d5847674..d19f0d5dcc0 100644 --- a/core/dbt/parser/schemas.py +++ b/core/dbt/parser/schemas.py @@ -5,6 +5,7 @@ from typing import Any, Callable, Dict, Generic, Iterable, List, Optional, Type, TypeVar from dataclasses import dataclass, field +from dbt.common.constraints import ConstraintType, ModelLevelConstraint from dbt.common.dataclass_schema import ValidationError, dbtClassMixin from dbt.clients.yaml_helper import load_yaml_text @@ -17,9 +18,7 @@ ParsedNodePatch, ParsedMacroPatch, UnpatchedSourceDefinition, - ConstraintType, ModelNode, - ModelLevelConstraint, ) from dbt.contracts.graph.unparsed import ( HasColumnDocs, diff --git a/plugins/postgres/dbt/adapters/postgres/impl.py b/plugins/postgres/dbt/adapters/postgres/impl.py index 2cc9e5079a4..0fb38d2a3a5 100644 --- a/plugins/postgres/dbt/adapters/postgres/impl.py +++ b/plugins/postgres/dbt/adapters/postgres/impl.py @@ -9,9 +9,9 @@ from dbt.adapters.postgres import PostgresConnectionManager from dbt.adapters.postgres.column import PostgresColumn from dbt.adapters.postgres import PostgresRelation +from dbt.common.constraints import ConstraintType from dbt.common.dataclass_schema import dbtClassMixin, ValidationError from dbt.common.exceptions import DbtRuntimeError -from dbt.contracts.graph.nodes import ConstraintType from dbt.adapters.exceptions import ( CrossDbReferenceProhibitedError, IndexConfigNotDictError, From f7a49448b342aae9207308e6f774cc9f7c28298f Mon Sep 17 00:00:00 2001 From: Peter Allen Webb Date: Mon, 20 Nov 2023 17:59:24 -0500 Subject: [PATCH 2/3] Move constraints to contracts folder, per review --- core/dbt/adapters/base/impl.py | 6 +++++- core/dbt/common/{ => contracts}/constraints.py | 0 core/dbt/contracts/graph/nodes.py | 6 +++++- core/dbt/parser/common.py | 2 +- core/dbt/parser/schemas.py | 2 +- plugins/postgres/dbt/adapters/postgres/impl.py | 2 +- 6 files changed, 13 insertions(+), 5 deletions(-) rename core/dbt/common/{ => contracts}/constraints.py (100%) diff --git a/core/dbt/adapters/base/impl.py b/core/dbt/adapters/base/impl.py index 34e6cb63eb1..f2d91a3cbcb 100644 --- a/core/dbt/adapters/base/impl.py +++ b/core/dbt/adapters/base/impl.py @@ -23,7 +23,11 @@ from multiprocessing.context import SpawnContext from dbt.adapters.capability import Capability, CapabilityDict -from dbt.common.constraints import ColumnLevelConstraint, ConstraintType, ModelLevelConstraint +from dbt.common.contracts.constraints import ( + ColumnLevelConstraint, + ConstraintType, + ModelLevelConstraint, +) import agate import pytz diff --git a/core/dbt/common/constraints.py b/core/dbt/common/contracts/constraints.py similarity index 100% rename from core/dbt/common/constraints.py rename to core/dbt/common/contracts/constraints.py diff --git a/core/dbt/contracts/graph/nodes.py b/core/dbt/contracts/graph/nodes.py index 180692a81eb..fad8a427016 100644 --- a/core/dbt/contracts/graph/nodes.py +++ b/core/dbt/contracts/graph/nodes.py @@ -7,7 +7,11 @@ from mashumaro.types import SerializableType from typing import Optional, Union, List, Dict, Any, Sequence, Tuple, Iterator, Literal -from dbt.common.constraints import ColumnLevelConstraint, ConstraintType, ModelLevelConstraint +from dbt.common.contracts.constraints import ( + ColumnLevelConstraint, + ConstraintType, + ModelLevelConstraint, +) from dbt.common.dataclass_schema import dbtClassMixin, ExtensibleDbtClassMixin from dbt.clients.system import write_file diff --git a/core/dbt/parser/common.py b/core/dbt/parser/common.py index dda54b34c38..4c030a776d4 100644 --- a/core/dbt/parser/common.py +++ b/core/dbt/parser/common.py @@ -1,4 +1,4 @@ -from dbt.common.constraints import ColumnLevelConstraint, ConstraintType +from dbt.common.contracts.constraints import ColumnLevelConstraint, ConstraintType from dbt.contracts.graph.unparsed import ( HasColumnProps, UnparsedColumn, diff --git a/core/dbt/parser/schemas.py b/core/dbt/parser/schemas.py index d19f0d5dcc0..216e8caaec8 100644 --- a/core/dbt/parser/schemas.py +++ b/core/dbt/parser/schemas.py @@ -5,7 +5,7 @@ from typing import Any, Callable, Dict, Generic, Iterable, List, Optional, Type, TypeVar from dataclasses import dataclass, field -from dbt.common.constraints import ConstraintType, ModelLevelConstraint +from dbt.common.contracts.constraints import ConstraintType, ModelLevelConstraint from dbt.common.dataclass_schema import ValidationError, dbtClassMixin from dbt.clients.yaml_helper import load_yaml_text diff --git a/plugins/postgres/dbt/adapters/postgres/impl.py b/plugins/postgres/dbt/adapters/postgres/impl.py index 0fb38d2a3a5..8dc5c487245 100644 --- a/plugins/postgres/dbt/adapters/postgres/impl.py +++ b/plugins/postgres/dbt/adapters/postgres/impl.py @@ -9,7 +9,7 @@ from dbt.adapters.postgres import PostgresConnectionManager from dbt.adapters.postgres.column import PostgresColumn from dbt.adapters.postgres import PostgresRelation -from dbt.common.constraints import ConstraintType +from dbt.common.contracts.constraints import ConstraintType from dbt.common.dataclass_schema import dbtClassMixin, ValidationError from dbt.common.exceptions import DbtRuntimeError from dbt.adapters.exceptions import ( From f000b86cadc8e5ca98aa86d5e8316d7c3ade6ad0 Mon Sep 17 00:00:00 2001 From: Peter Allen Webb Date: Mon, 20 Nov 2023 18:33:11 -0500 Subject: [PATCH 3/3] Add a changelog entry. --- .changes/unreleased/Under the Hood-20231120-183214.yaml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .changes/unreleased/Under the Hood-20231120-183214.yaml diff --git a/.changes/unreleased/Under the Hood-20231120-183214.yaml b/.changes/unreleased/Under the Hood-20231120-183214.yaml new file mode 100644 index 00000000000..570dd360d8c --- /dev/null +++ b/.changes/unreleased/Under the Hood-20231120-183214.yaml @@ -0,0 +1,7 @@ +kind: Under the Hood +body: Move column constraints into common/contracts, removing another dependency of + adapters on core. +time: 2023-11-20T18:32:14.859503-05:00 +custom: + Author: peterallenwebb + Issue: "9024"