Skip to content
This repository was archived by the owner on Jan 23, 2026. It is now read-only.

Commit 33df711

Browse files
committed
Refactor dump_json/dump_yaml into SerializableBaseModel base class
1 parent e596937 commit 33df711

5 files changed

Lines changed: 23 additions & 47 deletions

File tree

packages/jumpstarter-cli-common/jumpstarter_cli_common/version.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
import sys
44

55
import asyncclick as click
6-
import yaml
7-
from pydantic import BaseModel, ConfigDict, Field
6+
from pydantic import ConfigDict, Field
87

98
from .opt import OutputMode, OutputType, opt_output_all
9+
from jumpstarter.common.pydantic import SerializableBaseModel
1010

1111

1212
def get_client_version():
@@ -27,18 +27,12 @@ def version_msg():
2727
return f"Jumpstarter v{jumpstarter_version} from {location} (Python {python_version})"
2828

2929

30-
class JumpstarterVersion(BaseModel):
30+
class JumpstarterVersion(SerializableBaseModel):
3131
git_version: str = Field(alias="gitVersion")
3232
python_version: str = Field(alias="pythonVersion")
3333

3434
model_config = ConfigDict(populate_by_name=True)
3535

36-
def dump_json(self):
37-
return self.model_dump_json(indent=4, by_alias=True)
38-
39-
def dump_yaml(self):
40-
return yaml.safe_dump(self.model_dump(mode="json", by_alias=True), indent=2)
41-
4236

4337
def version_obj():
4438
return JumpstarterVersion(git_version=importlib.metadata.version("jumpstarter"), python_version=sys.version)

packages/jumpstarter/jumpstarter/client/grpc.py

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
from dataclasses import dataclass, field
44
from datetime import datetime, timedelta
55

6-
import yaml
76
from google.protobuf import duration_pb2, field_mask_pb2, json_format
87
from grpc.aio import Channel
98
from jumpstarter_protocol import client_pb2, client_pb2_grpc, kubernetes_pb2
10-
from pydantic import BaseModel, ConfigDict, Field, field_serializer
9+
from pydantic import ConfigDict, Field, field_serializer
1110

1211
from jumpstarter.common.grpc import translate_grpc_exceptions
12+
from jumpstarter.common.pydantic import SerializableBaseModel
1313

1414

1515
def parse_identifier(identifier: str, kind: str) -> (str, str):
@@ -35,7 +35,7 @@ def parse_lease_identifier(identifier: str) -> (str, str):
3535
return parse_identifier(identifier, "leases")
3636

3737

38-
class Exporter(BaseModel):
38+
class Exporter(SerializableBaseModel):
3939
namespace: str
4040
name: str
4141
labels: dict[str, str]
@@ -46,7 +46,7 @@ def from_protobuf(cls, data: client_pb2.Exporter) -> Exporter:
4646
return cls(namespace=namespace, name=name, labels=data.labels)
4747

4848

49-
class Lease(BaseModel):
49+
class Lease(SerializableBaseModel):
5050
namespace: str
5151
name: str
5252
selector: str
@@ -92,14 +92,8 @@ def from_protobuf(cls, data: client_pb2.Lease) -> Lease:
9292
conditions=data.conditions,
9393
)
9494

95-
def dump_json(self):
96-
return self.model_dump_json(indent=4, by_alias=True)
9795

98-
def dump_yaml(self):
99-
return yaml.safe_dump(self.model_dump(mode="json", by_alias=True), indent=2)
100-
101-
102-
class ExporterList(BaseModel):
96+
class ExporterList(SerializableBaseModel):
10397
exporters: list[Exporter]
10498
next_page_token: str | None = Field(exclude=True)
10599

@@ -110,14 +104,8 @@ def from_protobuf(cls, data: client_pb2.ListExportersResponse) -> ExporterList:
110104
next_page_token=data.next_page_token,
111105
)
112106

113-
def dump_json(self):
114-
return self.model_dump_json(indent=4, by_alias=True)
115-
116-
def dump_yaml(self):
117-
return yaml.safe_dump(self.model_dump(mode="json", by_alias=True), indent=2)
118107

119-
120-
class LeaseList(BaseModel):
108+
class LeaseList(SerializableBaseModel):
121109
leases: list[Lease]
122110
next_page_token: str | None = Field(exclude=True)
123111

@@ -128,12 +116,6 @@ def from_protobuf(cls, data: client_pb2.ListLeasesResponse) -> LeaseList:
128116
next_page_token=data.next_page_token,
129117
)
130118

131-
def dump_json(self):
132-
return self.model_dump_json(indent=4, by_alias=True)
133-
134-
def dump_yaml(self):
135-
return yaml.safe_dump(self.model_dump(mode="json", by_alias=True), indent=2)
136-
137119

138120
@dataclass(kw_only=True, slots=True)
139121
class ClientService:
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import yaml
2+
from pydantic import BaseModel
3+
4+
5+
class SerializableBaseModel(BaseModel):
6+
def dump_json(self):
7+
return self.model_dump_json(indent=4, by_alias=True)
8+
9+
def dump_yaml(self):
10+
return yaml.safe_dump(self.model_dump(mode="json", by_alias=True), indent=2)

packages/jumpstarter/jumpstarter/config/client.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from jumpstarter.client.grpc import ClientService
1717
from jumpstarter.common.exceptions import FileNotFoundError
1818
from jumpstarter.common.grpc import aio_secure_channel, ssl_channel_credentials
19+
from jumpstarter.common.pydantic import SerializableBaseModel
1920

2021

2122
def _allow_from_env():
@@ -274,16 +275,10 @@ def delete(cls, alias: str) -> Path:
274275
return path
275276

276277

277-
class ClientConfigListV1Alpha1(BaseModel):
278+
class ClientConfigListV1Alpha1(SerializableBaseModel):
278279
api_version: Literal["jumpstarter.dev/v1alpha1"] = Field(alias="apiVersion", default="jumpstarter.dev/v1alpha1")
279280
current_config: Optional[str] = Field(alias="currentConfig")
280281
items: list[ClientConfigV1Alpha1]
281282
kind: Literal["ClientConfigList"] = Field(default="ClientConfigList")
282283

283-
def dump_json(self):
284-
return self.model_dump_json(indent=4, by_alias=True)
285-
286-
def dump_yaml(self):
287-
return yaml.safe_dump(self.model_dump(mode="json", by_alias=True), indent=2)
288-
289284
model_config = ConfigDict(arbitrary_types_allowed=True, populate_by_name=True)

packages/jumpstarter/jumpstarter/config/exporter.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from .tls import TLSConfigV1Alpha1
1515
from jumpstarter.common.grpc import aio_secure_channel, ssl_channel_credentials
1616
from jumpstarter.common.importlib import import_class
17+
from jumpstarter.common.pydantic import SerializableBaseModel
1718
from jumpstarter.driver import Driver
1819

1920

@@ -175,15 +176,9 @@ async def channel_factory():
175176
await exporter.serve()
176177

177178

178-
class ExporterConfigListV1Alpha1(BaseModel):
179+
class ExporterConfigListV1Alpha1(SerializableBaseModel):
179180
api_version: Literal["jumpstarter.dev/v1alpha1"] = Field(alias="apiVersion", default="jumpstarter.dev/v1alpha1")
180181
items: list[ExporterConfigV1Alpha1]
181182
kind: Literal["ExporterConfigList"] = Field(default="ExporterConfigList")
182183

183-
def dump_json(self):
184-
return self.model_dump_json(indent=4, by_alias=True)
185-
186-
def dump_yaml(self):
187-
return yaml.safe_dump(self.model_dump(mode="json", by_alias=True), indent=2)
188-
189184
model_config = ConfigDict(arbitrary_types_allowed=True, populate_by_name=True)

0 commit comments

Comments
 (0)