55import typing as t
66
77import pydantic
8- from pydantic import BaseModel , Field
8+ from pydantic import Field
99from sqlglot import exp
1010from watchfiles import Change
1111
2121from sqlmesh .utils .date import TimeLike , now_timestamp
2222from sqlmesh .utils .pydantic import (
2323 PYDANTIC_MAJOR_VERSION ,
24+ PydanticModel ,
2425 field_validator ,
2526 field_validator_v1_args ,
2627)
@@ -111,7 +112,7 @@ class PlanStage(str, enum.Enum):
111112 cancel = "cancel"
112113
113114
114- class File (BaseModel ):
115+ class File (PydanticModel ):
115116 name : str
116117 path : str
117118 extension : str = ""
@@ -128,25 +129,25 @@ def default_extension(cls, v: str, values: t.Dict[str, t.Any]) -> str:
128129 return v
129130
130131
131- class Directory (BaseModel ):
132+ class Directory (PydanticModel ):
132133 name : str
133134 path : str
134135 directories : t .List [Directory ] = []
135136 files : t .List [File ] = []
136137
137138
138- class Meta (BaseModel ):
139+ class Meta (PydanticModel ):
139140 version : str
140141 has_running_task : bool = False
141142
142143
143- class Reference (BaseModel ):
144+ class Reference (PydanticModel ):
144145 name : str
145146 expression : str
146147 unique : bool
147148
148149
149- class ModelDetails (BaseModel ):
150+ class ModelDetails (PydanticModel ):
150151 owner : t .Optional [str ] = None
151152 kind : t .Optional [str ] = None
152153 batch_size : t .Optional [int ] = None
@@ -167,13 +168,13 @@ class ModelDetails(BaseModel):
167168 annotated : t .Optional [bool ] = None
168169
169170
170- class Column (BaseModel ):
171+ class Column (PydanticModel ):
171172 name : str
172173 type : str
173174 description : t .Optional [str ] = None
174175
175176
176- class Model (BaseModel ):
177+ class Model (PydanticModel ):
177178 name : str
178179 fqn : str
179180 path : str
@@ -187,7 +188,7 @@ class Model(BaseModel):
187188 hash : str
188189
189190
190- class ChangeDisplay (BaseModel ):
191+ class ChangeDisplay (PydanticModel ):
191192 name : str
192193 view_name : str
193194 node_type : NodeType = NodeType .MODEL
@@ -222,7 +223,7 @@ class ChangeIndirect(ChangeDisplay):
222223 pass
223224
224225
225- class ModelsDiff (BaseModel ):
226+ class ModelsDiff (PydanticModel ):
226227 direct : t .List [ChangeDirect ] = []
227228 indirect : t .List [ChangeIndirect ] = []
228229 metadata : t .List [ChangeDisplay ] = []
@@ -299,26 +300,26 @@ def _get_parents(
299300 )
300301
301302
302- class Environments (BaseModel ):
303+ class Environments (PydanticModel ):
303304 environments : t .Dict [str , Environment ] = {}
304305 pinned_environments : t .Set [str ] = set ()
305306 default_target_environment : str = ""
306307
307308
308- class EvaluateInput (BaseModel ):
309+ class EvaluateInput (PydanticModel ):
309310 model : str
310311 start : TimeLike
311312 end : TimeLike
312313 execution_time : TimeLike
313314 limit : int = 1000
314315
315316
316- class FetchdfInput (BaseModel ):
317+ class FetchdfInput (PydanticModel ):
317318 sql : str
318319 limit : int = 1000
319320
320321
321- class RenderInput (BaseModel ):
322+ class RenderInput (PydanticModel ):
322323 model : str
323324 start : t .Optional [TimeLike ] = None
324325 end : t .Optional [TimeLike ] = None
@@ -328,12 +329,12 @@ class RenderInput(BaseModel):
328329 dialect : t .Optional [str ] = None
329330
330331
331- class PlanDates (BaseModel ):
332+ class PlanDates (PydanticModel ):
332333 start : t .Optional [TimeLike ] = None
333334 end : t .Optional [TimeLike ] = None
334335
335336
336- class PlanOptions (BaseModel ):
337+ class PlanOptions (PydanticModel ):
337338 skip_tests : bool = False
338339 skip_backfill : bool = False
339340 no_gaps : bool = False
@@ -352,17 +353,17 @@ def validate_restate_models(cls, v: str | list[str]) -> list[str]:
352353 return v
353354
354355
355- class LineageColumn (BaseModel ):
356+ class LineageColumn (PydanticModel ):
356357 source : t .Optional [str ] = None
357358 expression : t .Optional [str ] = None
358359 models : t .Dict [str , t .Set [str ]]
359360
360361
361- class Query (BaseModel ):
362+ class Query (PydanticModel ):
362363 sql : str
363364
364365
365- class ApiExceptionPayload (BaseModel ):
366+ class ApiExceptionPayload (PydanticModel ):
366367 timestamp : int
367368 message : str
368369 origin : str
@@ -374,7 +375,7 @@ class ApiExceptionPayload(BaseModel):
374375 stack : t .Optional [t .List [str ]] = None
375376
376377
377- class SchemaDiff (BaseModel ):
378+ class SchemaDiff (PydanticModel ):
378379 source : str
379380 target : str
380381 source_schema : t .Dict [str , str ]
@@ -398,7 +399,7 @@ def validate_schema(
398399 return v
399400
400401
401- class RowDiff (BaseModel ):
402+ class RowDiff (PydanticModel ):
402403 source : str
403404 target : str
404405 stats : t .Dict [str , float ]
@@ -408,13 +409,13 @@ class RowDiff(BaseModel):
408409 count_pct_change : float
409410
410411
411- class TableDiff (BaseModel ):
412+ class TableDiff (PydanticModel ):
412413 schema_diff : SchemaDiff
413414 row_diff : RowDiff
414415 on : t .List [t .List [str ]]
415416
416417
417- class TestCase (BaseModel ):
418+ class TestCase (PydanticModel ):
418419 name : str
419420 path : pathlib .Path
420421
@@ -427,22 +428,22 @@ class TestSkipped(TestCase):
427428 reason : str
428429
429430
430- class TestResult (BaseModel ):
431+ class TestResult (PydanticModel ):
431432 tests_run : int
432433 failures : t .List [TestErrorOrFailure ]
433434 errors : t .List [TestErrorOrFailure ]
434435 skipped : t .List [TestSkipped ]
435436 successes : t .List [TestCase ]
436437
437438
438- class ArtifactChange (BaseModel ):
439+ class ArtifactChange (PydanticModel ):
439440 change : Change
440441 path : str
441442 type : t .Optional [ArtifactType ] = None
442443 file : t .Optional [File ] = None
443444
444445
445- class ReportTestsResult (BaseModel ):
446+ class ReportTestsResult (PydanticModel ):
446447 message : str
447448
448449
@@ -473,7 +474,7 @@ class BackfillTask(ChangeDisplay):
473474 interval : t .Optional [t .List [str ]] = None
474475
475476
476- class TrackableMeta (BaseModel ):
477+ class TrackableMeta (PydanticModel ):
477478 status : Status = Status .INIT
478479 start : int = Field (default_factory = now_timestamp )
479480 end : t .Optional [int ] = None
@@ -489,7 +490,7 @@ def dict(self, *args: t.Any, **kwargs: t.Any) -> t.Dict[str, t.Any]:
489490 return data
490491
491492
492- class Trackable (BaseModel ):
493+ class Trackable (PydanticModel ):
493494 meta : TrackableMeta = Field (default_factory = TrackableMeta )
494495
495496 def stop (self , success : bool = True ) -> None :
@@ -514,7 +515,7 @@ class PlanStageCancel(Trackable):
514515 pass
515516
516517
517- class PlanChanges (BaseModel ):
518+ class PlanChanges (PydanticModel ):
518519 # can't have a set of pydantic models: https://github.com/pydantic/pydantic/issues/1090
519520 added : t .Optional [t .List [ChangeDisplay ]] = None
520521 removed : t .Optional [t .List [ChangeDisplay ]] = None
@@ -574,6 +575,6 @@ class PlanCancelStageTracker(PlanStageTracker):
574575 cancel : t .Optional [PlanStageCancel ] = None
575576
576577
577- class FormatFileStatus (BaseModel ):
578+ class FormatFileStatus (PydanticModel ):
578579 path : str
579580 status : Status = Status .INIT
0 commit comments