Skip to content

Commit 3a360ce

Browse files
refactor: migrate ConfigModel to Pydantic v2 and consolidate config
- Migrate ConfigModel from Pydantic v1 style (class Config) to v2 style (model_config = ConfigDict) - Replace 35 instances of manual 'model_config = {"extra": "forbid"}' with ConfigModel inheritance across 9 files - Simplify Filter union in search_filters.py by removing TYPE_CHECKING conditional - Fix redshift.py to use parse_obj_allow_extras() instead of direct Config.extra manipulation This eliminates code duplication and centralizes Pydantic configuration policy.
1 parent 9a68796 commit 3a360ce

File tree

12 files changed

+95
-171
lines changed

12 files changed

+95
-171
lines changed

metadata-ingestion/src/datahub/api/entities/assertion/assertion.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
from abc import abstractmethod
22
from typing import Optional
33

4-
from pydantic import BaseModel, Field
4+
from pydantic import Field
55

66
from datahub.api.entities.assertion.assertion_trigger import AssertionTrigger
7+
from datahub.configuration.common import ConfigModel
78
from datahub.metadata.com.linkedin.pegasus2avro.assertion import AssertionInfo
89

910

10-
class BaseAssertionProtocol(BaseModel):
11-
model_config = {"extra": "forbid"}
12-
11+
class BaseAssertionProtocol(ConfigModel):
1312
@abstractmethod
1413
def get_id(self) -> str:
1514
pass
@@ -27,9 +26,7 @@ def get_assertion_trigger(
2726
pass
2827

2928

30-
class BaseAssertion(BaseModel):
31-
model_config = {"extra": "forbid"}
32-
29+
class BaseAssertion(ConfigModel):
3330
id_raw: Optional[str] = Field(
3431
default=None,
3532
description="The raw id of the assertion."

metadata-ingestion/src/datahub/api/entities/assertion/assertion_config_spec.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
from typing import List, Optional
22

3-
from pydantic import BaseModel, Field
3+
from pydantic import Field
44
from ruamel.yaml import YAML
55
from typing_extensions import Literal
66

77
from datahub.api.entities.assertion.datahub_assertion import DataHubAssertion
8+
from datahub.configuration.common import ConfigModel
89

910

10-
class AssertionsConfigSpec(BaseModel):
11+
class AssertionsConfigSpec(ConfigModel):
1112
"""
1213
Declarative configuration specification for datahub assertions.
1314
@@ -18,8 +19,6 @@ class AssertionsConfigSpec(BaseModel):
1819
In future, this would invoke datahub GraphQL API to upsert assertions.
1920
"""
2021

21-
model_config = {"extra": "forbid"}
22-
2322
version: Literal[1]
2423

2524
id: Optional[str] = Field(

metadata-ingestion/src/datahub/api/entities/assertion/assertion_operator.py

Lines changed: 18 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import json
22
from typing import List, Optional, Union
33

4-
from pydantic import BaseModel
54
from typing_extensions import Literal, Protocol
65

6+
from datahub.configuration.common import ConfigModel
77
from datahub.metadata.schema_classes import (
88
AssertionStdOperatorClass,
99
AssertionStdParameterClass,
@@ -61,9 +61,7 @@ def _generate_assertion_std_parameters(
6161
)
6262

6363

64-
class EqualToOperator(BaseModel):
65-
model_config = {"extra": "forbid"}
66-
64+
class EqualToOperator(ConfigModel):
6765
type: Literal["equal_to"]
6866
value: Union[str, int, float]
6967

@@ -76,8 +74,7 @@ def generate_parameters(self) -> AssertionStdParametersClass:
7674
return _generate_assertion_std_parameters(value=self.value)
7775

7876

79-
class NotEqualToOperator(BaseModel):
80-
model_config = {"extra": "forbid"}
77+
class NotEqualToOperator(ConfigModel):
8178
type: Literal["not_equal_to"]
8279
value: Union[str, int, float]
8380

@@ -90,9 +87,7 @@ def generate_parameters(self) -> AssertionStdParametersClass:
9087
return _generate_assertion_std_parameters(value=self.value)
9188

9289

93-
class BetweenOperator(BaseModel):
94-
model_config = {"extra": "forbid"}
95-
90+
class BetweenOperator(ConfigModel):
9691
type: Literal["between"]
9792
min: Union[int, float]
9893
max: Union[int, float]
@@ -108,9 +103,7 @@ def generate_parameters(self) -> AssertionStdParametersClass:
108103
)
109104

110105

111-
class LessThanOperator(BaseModel):
112-
model_config = {"extra": "forbid"}
113-
106+
class LessThanOperator(ConfigModel):
114107
type: Literal["less_than"]
115108
value: Union[int, float]
116109

@@ -123,9 +116,7 @@ def generate_parameters(self) -> AssertionStdParametersClass:
123116
return _generate_assertion_std_parameters(value=self.value)
124117

125118

126-
class GreaterThanOperator(BaseModel):
127-
model_config = {"extra": "forbid"}
128-
119+
class GreaterThanOperator(ConfigModel):
129120
type: Literal["greater_than"]
130121
value: Union[int, float]
131122

@@ -138,9 +129,7 @@ def generate_parameters(self) -> AssertionStdParametersClass:
138129
return _generate_assertion_std_parameters(value=self.value)
139130

140131

141-
class LessThanOrEqualToOperator(BaseModel):
142-
model_config = {"extra": "forbid"}
143-
132+
class LessThanOrEqualToOperator(ConfigModel):
144133
type: Literal["less_than_or_equal_to"]
145134
value: Union[int, float]
146135

@@ -153,9 +142,7 @@ def generate_parameters(self) -> AssertionStdParametersClass:
153142
return _generate_assertion_std_parameters(value=self.value)
154143

155144

156-
class GreaterThanOrEqualToOperator(BaseModel):
157-
model_config = {"extra": "forbid"}
158-
145+
class GreaterThanOrEqualToOperator(ConfigModel):
159146
type: Literal["greater_than_or_equal_to"]
160147
value: Union[int, float]
161148

@@ -168,9 +155,7 @@ def generate_parameters(self) -> AssertionStdParametersClass:
168155
return _generate_assertion_std_parameters(value=self.value)
169156

170157

171-
class InOperator(BaseModel):
172-
model_config = {"extra": "forbid"}
173-
158+
class InOperator(ConfigModel):
174159
type: Literal["in"]
175160
value: List[Union[str, float, int]]
176161

@@ -183,9 +168,7 @@ def generate_parameters(self) -> AssertionStdParametersClass:
183168
return _generate_assertion_std_parameters(value=self.value)
184169

185170

186-
class NotInOperator(BaseModel):
187-
model_config = {"extra": "forbid"}
188-
171+
class NotInOperator(ConfigModel):
189172
type: Literal["not_in"]
190173
value: List[Union[str, float, int]]
191174

@@ -198,9 +181,7 @@ def generate_parameters(self) -> AssertionStdParametersClass:
198181
return _generate_assertion_std_parameters(value=self.value)
199182

200183

201-
class IsNullOperator(BaseModel):
202-
model_config = {"extra": "forbid"}
203-
184+
class IsNullOperator(ConfigModel):
204185
type: Literal["is_null"]
205186

206187
operator: str = AssertionStdOperatorClass.NULL
@@ -212,9 +193,7 @@ def generate_parameters(self) -> AssertionStdParametersClass:
212193
return _generate_assertion_std_parameters()
213194

214195

215-
class NotNullOperator(BaseModel):
216-
model_config = {"extra": "forbid"}
217-
196+
class NotNullOperator(ConfigModel):
218197
type: Literal["is_not_null"]
219198

220199
operator: str = AssertionStdOperatorClass.NOT_NULL
@@ -226,9 +205,7 @@ def generate_parameters(self) -> AssertionStdParametersClass:
226205
return _generate_assertion_std_parameters()
227206

228207

229-
class IsTrueOperator(BaseModel):
230-
model_config = {"extra": "forbid"}
231-
208+
class IsTrueOperator(ConfigModel):
232209
type: Literal["is_true"]
233210

234211
operator: str = AssertionStdOperatorClass.IS_TRUE
@@ -240,9 +217,7 @@ def generate_parameters(self) -> AssertionStdParametersClass:
240217
return _generate_assertion_std_parameters()
241218

242219

243-
class IsFalseOperator(BaseModel):
244-
model_config = {"extra": "forbid"}
245-
220+
class IsFalseOperator(ConfigModel):
246221
type: Literal["is_false"]
247222

248223
operator: str = AssertionStdOperatorClass.IS_FALSE
@@ -254,9 +229,7 @@ def generate_parameters(self) -> AssertionStdParametersClass:
254229
return _generate_assertion_std_parameters()
255230

256231

257-
class ContainsOperator(BaseModel):
258-
model_config = {"extra": "forbid"}
259-
232+
class ContainsOperator(ConfigModel):
260233
type: Literal["contains"]
261234
value: str
262235

@@ -269,9 +242,7 @@ def generate_parameters(self) -> AssertionStdParametersClass:
269242
return _generate_assertion_std_parameters(value=self.value)
270243

271244

272-
class EndsWithOperator(BaseModel):
273-
model_config = {"extra": "forbid"}
274-
245+
class EndsWithOperator(ConfigModel):
275246
type: Literal["ends_with"]
276247
value: str
277248

@@ -284,9 +255,7 @@ def generate_parameters(self) -> AssertionStdParametersClass:
284255
return _generate_assertion_std_parameters(value=self.value)
285256

286257

287-
class StartsWithOperator(BaseModel):
288-
model_config = {"extra": "forbid"}
289-
258+
class StartsWithOperator(ConfigModel):
290259
type: Literal["starts_with"]
291260
value: str
292261

@@ -299,9 +268,7 @@ def generate_parameters(self) -> AssertionStdParametersClass:
299268
return _generate_assertion_std_parameters(value=self.value)
300269

301270

302-
class MatchesRegexOperator(BaseModel):
303-
model_config = {"extra": "forbid"}
304-
271+
class MatchesRegexOperator(ConfigModel):
305272
type: Literal["matches_regex"]
306273
value: str
307274

metadata-ingestion/src/datahub/api/entities/assertion/assertion_trigger.py

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
from typing import Union
33

44
import humanfriendly
5-
from pydantic import BaseModel, Field, RootModel, field_validator
5+
from pydantic import Field, RootModel, field_validator
66
from typing_extensions import Literal
77

8+
from datahub.configuration.common import ConfigModel
89

9-
class CronTrigger(BaseModel):
10-
model_config = {"extra": "forbid"}
1110

11+
class CronTrigger(ConfigModel):
1212
type: Literal["cron"]
1313
cron: str = Field(
1414
description="The cron expression to use. See https://crontab.guru/ for help."
@@ -19,9 +19,7 @@ class CronTrigger(BaseModel):
1919
)
2020

2121

22-
class IntervalTrigger(BaseModel):
23-
model_config = {"extra": "forbid"}
24-
22+
class IntervalTrigger(ConfigModel):
2523
type: Literal["interval"]
2624
interval: timedelta
2725

@@ -34,15 +32,11 @@ def lookback_interval_to_timedelta(cls, v):
3432
raise ValueError("Invalid value.")
3533

3634

37-
class EntityChangeTrigger(BaseModel):
38-
model_config = {"extra": "forbid"}
39-
35+
class EntityChangeTrigger(ConfigModel):
4036
type: Literal["on_table_change"]
4137

4238

43-
class ManualTrigger(BaseModel):
44-
model_config = {"extra": "forbid"}
45-
39+
class ManualTrigger(ConfigModel):
4640
type: Literal["manual"]
4741

4842

metadata-ingestion/src/datahub/api/entities/assertion/field_assertion.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from enum import Enum
22
from typing import Optional, Union
33

4-
from pydantic import BaseModel, Field
4+
from pydantic import Field
55
from typing_extensions import Literal
66

77
from datahub.api.entities.assertion.assertion import (
@@ -11,6 +11,7 @@
1111
from datahub.api.entities.assertion.assertion_trigger import AssertionTrigger
1212
from datahub.api.entities.assertion.field_metric import FieldMetric
1313
from datahub.api.entities.assertion.filter import DatasetFilter
14+
from datahub.configuration.common import ConfigModel
1415
from datahub.emitter.mce_builder import datahub_guid
1516
from datahub.metadata.com.linkedin.pegasus2avro.assertion import (
1617
AssertionInfo,
@@ -29,9 +30,7 @@
2930
)
3031

3132

32-
class FieldValuesFailThreshold(BaseModel):
33-
model_config = {"extra": "forbid"}
34-
33+
class FieldValuesFailThreshold(ConfigModel):
3534
type: Literal["count", "percentage"] = Field(default="count")
3635
value: int = Field(default=0)
3736

metadata-ingestion/src/datahub/api/entities/assertion/filter.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
from pydantic import BaseModel
21
from typing_extensions import Literal
32

3+
from datahub.configuration.common import ConfigModel
44

5-
class SqlFilter(BaseModel):
6-
model_config = {"extra": "forbid"}
75

6+
class SqlFilter(ConfigModel):
87
type: Literal["sql"]
98
sql: str
109

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
from typing import Optional
22

3-
from pydantic import BaseModel
3+
from datahub.configuration.common import ConfigModel
44

55

6-
class BaseAssertion(BaseModel):
7-
model_config = {"extra": "forbid"}
8-
6+
class BaseAssertion(ConfigModel):
97
description: Optional[str] = None

0 commit comments

Comments
 (0)