Skip to content

Commit cba8735

Browse files
authored
Chore: Update UI models to subclass PydanticModel (#2726)
1 parent 9d0610e commit cba8735

File tree

1 file changed

+31
-30
lines changed

1 file changed

+31
-30
lines changed

web/server/models.py

Lines changed: 31 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import typing as t
66

77
import pydantic
8-
from pydantic import BaseModel, Field
8+
from pydantic import Field
99
from sqlglot import exp
1010
from watchfiles import Change
1111

@@ -21,6 +21,7 @@
2121
from sqlmesh.utils.date import TimeLike, now_timestamp
2222
from 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

Comments
 (0)