Skip to content

Commit 02758cf

Browse files
committed
chore: migrate to pydantic v2
1 parent 0bd8456 commit 02758cf

18 files changed

+895
-725
lines changed

ops2deb.lock.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,12 @@
5252
- url: https://github.com/istio/istio/releases/download/1.17.2/istio-1.17.2-linux-amd64.tar.gz
5353
sha256: 9e301bf131be05434807623a2d45af6f625c7b159db4f291f5eb12f262259af7
5454
timestamp: 2023-04-25 12:44:43+00:00
55-
- url: https://github.com/upciti/ops2deb/releases/download/2.4.0/ops2deb_linux_amd64
56-
sha256: e611e8f85f899d4b55777b4212c6ce4f14f2dbedb1c11a3dd44ee1b63be47d7f
57-
timestamp: 2023-04-25 12:44:43+00:00
5855
- url: https://storage.googleapis.com/kubernetes-release/release/v1.27.1/bin/linux/amd64/kubectl
5956
sha256: 7fe3a762d926fb068bae32c399880e946e8caf3d903078bea9b169dcd5c17f6d
6057
timestamp: 2023-04-25 12:44:43+00:00
6158
- url: https://storage.googleapis.com/minikube/releases/v1.30.1/minikube-linux-amd64
6259
sha256: e53d9e8c31f4c5f683182f5323d3527aa0725f713945c6d081cf71aa548ab388
6360
timestamp: 2023-04-25 12:44:43+00:00
61+
- url: https://github.com/upciti/ops2deb/releases/download/2.4.1/ops2deb_linux_amd64
62+
sha256: 07e7f518941be9d2d207fd4d7f8b11fa9e9b2340cabeaf64032e8d44773f5d9f
63+
timestamp: 2023-12-11 10:39:21+00:00

ops2deb.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@
124124
- minikube-linux-amd64:/usr/bin/minikube
125125

126126
- name: ops2deb
127-
version: 2.4.0
127+
version: 2.4.1
128128
homepage: https://github.com/upciti/ops2deb
129129
summary: Debian packaging tool for portable applications
130130
description: |-

poetry.lock

Lines changed: 751 additions & 615 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,13 @@ packages = [
2121
python = ">=3.10,<3.12"
2222
httpx = ">=0.20.0"
2323
semver = "3.0.1"
24-
"ruamel.yaml" = ">=0.17.16"
24+
"ruamel.yaml" = "0.17.21"
2525
python-debian = ">=0.1.42"
2626
PyYAML = "^6"
2727
typer = ">=0.6.1"
2828
aiofiles = ">=0.1.9"
2929
Jinja2 = "^3"
30-
pydantic = "^1"
30+
pydantic = "^2"
3131
pyinstaller = { version = "5.13.0", optional = true }
3232
unix-ar = "^0.2.1"
3333
rich = "*"
@@ -50,8 +50,8 @@ safety = "*"
5050
types-aiofiles = "*"
5151
types-PyYAML = "*"
5252
pytest-asyncio = ">=0.18.0"
53-
fastapi = "*"
54-
ruff = "^0.0.282"
53+
fastapi = ">= 0.100"
54+
ruff = "*"
5555

5656
[tool.taskipy.tasks]
5757
check = """

src/ops2deb/apt.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,17 @@
55

66
import httpx
77
from debian.deb822 import Packages, Release
8-
from pydantic import BaseModel, Field, HttpUrl, ValidationError
8+
from pydantic import BaseModel, HttpUrl, TypeAdapter, ValidationError
99

1010
from ops2deb import logger
1111
from ops2deb.client import client_factory
1212
from ops2deb.exceptions import Ops2debAptError
1313

1414

15+
@dataclass(frozen=True)
1516
class DebianRepository(BaseModel):
16-
url: HttpUrl
17-
distribution: str = Field(..., regex=r"[a-zA-Z0-9]+")
17+
url: str
18+
distribution: str
1819

1920

2021
@dataclass(frozen=True, order=True)
@@ -64,9 +65,10 @@ def _parse_debian_repository_option(debian_repository: str) -> DebianRepository:
6465
'"{repository_url} {distribution}"'
6566
)
6667
try:
67-
return DebianRepository(url=url, distribution=distribution)
68-
except ValidationError as e:
69-
raise Ops2debAptError(str(e))
68+
TypeAdapter(HttpUrl).validate_python(url)
69+
except ValidationError:
70+
raise Ops2debAptError("Invalid repository URL")
71+
return DebianRepository(url=url, distribution=distribution)
7072

7173

7274
async def _list_repository_packages(

src/ops2deb/cli.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ def delta(
337337
state_delta = compute_state_delta(packages, resources.blueprints)
338338
print_state_delta_as_rich_table(state_delta)
339339
if output_as_json:
340-
print(state_delta.json(sort_keys=True, indent=2))
340+
print(state_delta.model_dump_json(indent=2))
341341
except Ops2debError as e:
342342
error(e, exit_code)
343343

src/ops2deb/delta.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def compute_state_delta(
2828
new_slugs = blueprint_slugs - common_slugs
2929
deleted_slugs = package_slugs - common_slugs
3030

31-
state_delta = StateDelta.construct(added=[], removed=[])
31+
state_delta = StateDelta.model_construct(added=[], removed=[])
3232
for slug in new_slugs:
3333
name, version, architecture = slug.split("_")
3434
state_delta.added.append(DebianRepositoryPackage(name, version, architecture))

src/ops2deb/formatter.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ def format_description(description: str) -> str:
4545
def format_blueprint(blueprint: dict[str, Any]) -> dict[str, Any]:
4646
if blueprint_arch := blueprint.pop("arch", None):
4747
blueprint["architecture"] = blueprint_arch
48-
blueprint = json.loads(Blueprint.construct(**blueprint).json(exclude_defaults=True))
48+
blueprint = json.loads(
49+
Blueprint.model_validate(blueprint).model_dump_json(exclude_defaults=True)
50+
)
4951
if (blueprint_fetch := blueprint.get("fetch", None)) and len(blueprint_fetch) == 1:
5052
blueprint["fetch"] = blueprint_fetch["url"]
5153
if blueprint_desc := blueprint.get("description", None):

src/ops2deb/generator.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def __init__(
4343

4444
def _render_template(self, template_name: str) -> None:
4545
template = environment.get_template(f"{template_name}")
46-
package = self.blueprint.dict(exclude={"fetch", "script"})
46+
package = self.blueprint.model_dump(exclude={"fetch", "script"})
4747
package.update({"version": self.debian_version})
4848
template.stream(package=package).dump(str(self.debian_directory / template_name))
4949

@@ -204,7 +204,9 @@ def generate(
204204
packages: list[SourcePackage] = []
205205
for blueprint in blueprints:
206206
for arch, version in product(blueprint.architectures(), blueprint.versions()):
207-
blueprint = blueprint.copy(update={"architecture": arch, "version": version})
207+
blueprint = blueprint.model_copy(
208+
update={"architecture": arch, "version": version}
209+
)
208210
configuration_file = resources.get_blueprint_configuration_file(blueprint)
209211
configuration_directory = configuration_file.path.parent
210212
package = SourcePackage(blueprint, output_directory, configuration_directory)

src/ops2deb/lockfile.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from typing import Protocol, Sequence
55

66
import yaml
7-
from pydantic import BaseModel, ValidationError
7+
from pydantic import BaseModel, RootModel, ValidationError
88

99
from ops2deb.exceptions import Ops2debLockFileError
1010
from ops2deb.utils import PrettyYAMLDumper
@@ -21,8 +21,7 @@ class LockEntry(BaseModel):
2121
timestamp: datetime
2222

2323

24-
class LockFileModel(BaseModel):
25-
__root__: list[LockEntry]
24+
LockFileModel = RootModel[list[LockEntry]]
2625

2726

2827
def get_utc_datetime() -> datetime:
@@ -39,7 +38,7 @@ def __init__(self, lockfile_path: Path) -> None:
3938
if lockfile_path.exists() is True:
4039
with lockfile_path.open("r") as reader:
4140
raw_lockfile = yaml.load(reader, yaml.SafeLoader)
42-
lockfile = LockFileModel.parse_obj(raw_lockfile).__root__
41+
lockfile = LockFileModel.model_validate(raw_lockfile).root
4342
self._entries.update({entry.url: entry for entry in lockfile})
4443
except yaml.YAMLError as e:
4544
raise Ops2debLockFileError(f"Invalid YAML file.\n{e}")
@@ -92,7 +91,7 @@ def save(self) -> None:
9291
entry.timestamp = now
9392

9493
# sort lockfile entries by urls
95-
entries = [entry.dict() for entry in self._entries.values()]
94+
entries = [entry.model_dump() for entry in self._entries.values()]
9695
sorted_entries = sorted(entries, key=itemgetter("timestamp", "url"))
9796

9897
with self.lock_file_path.open("w") as output:

0 commit comments

Comments
 (0)