Skip to content

Commit b807228

Browse files
committed
test: type packagelib in strict mode
Useful when working on integration tests and wanting to quickly see the required types for `createPackage`.
1 parent 3c62969 commit b807228

File tree

2 files changed

+23
-17
lines changed

2 files changed

+23
-17
lines changed

pyproject.toml

+1
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ module = [
6969

7070
# test/common
7171
'testlib',
72+
'packagelib',
7273
'js_coverage',
7374
'webdriver_bidi',
7475
]

test/common/packagelib.py

+22-17
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,13 @@
1919
import os
2020
import re
2121
import textwrap
22+
from collections.abc import Mapping
2223

2324
from testlib import MachineCase
2425

2526

2627
class PackageCase(MachineCase):
27-
def setUp(self):
28+
def setUp(self) -> None:
2829
super().setUp()
2930

3031
self.repo_dir = os.path.join(self.vm_tmpdir, "repo")
@@ -129,7 +130,7 @@ def setUp(self):
129130
self.addCleanup(self.machine.execute, "systemctl disable --now dnf5-automatic.timer 2>/dev/null || true")
130131
self.addCleanup(self.machine.execute, "rm -r /etc/systemd/system/dnf5-automatic*.d && systemctl daemon-reload || true")
131132

132-
self.updateInfo = {}
133+
self.updateInfo: dict[tuple[str, str, str], Mapping[str, str]] = {}
133134

134135
# HACK: kpatch check sometimes complains that we don't set up a full repo in unrelated tests
135136
self.allow_browser_errors("Could not determine kpatch packages:.*repodata updates was not complete")
@@ -138,8 +139,9 @@ def setUp(self):
138139
# Helper functions for creating packages/repository
139140
#
140141

141-
def createPackage(self, name, version, release, install=False,
142-
postinst=None, depends="", content=None, arch=None, provides=None, **updateinfo):
142+
def createPackage(self, name: str, version: str, release: str, *, install: bool = False,
143+
postinst: str | None = None, depends: str = "", content: Mapping[str, Mapping[str, str] | str] | None = None,
144+
arch: str | None = None, provides: str | None = None, **updateinfo: str) -> None:
143145
"""Create a dummy package in repo_dir on self.machine
144146
145147
If install is True, install the package. Otherwise, update the package
@@ -151,15 +153,16 @@ def createPackage(self, name, version, release, install=False,
151153
provides = ""
152154

153155
if self.backend == "apt":
154-
self.createDeb(name, version + '-' + release, depends, postinst, install, content, arch, provides)
156+
self.createDeb(name, version + '-' + release, depends, postinst, install=install, content=content, arch=arch, provides=provides)
155157
elif self.backend == "alpm":
156-
self.createPacmanPkg(name, version, release, depends, postinst, install, content, arch, provides)
158+
self.createPacmanPkg(name, version, release, depends, postinst, install=install, content=content, arch=arch, provides=provides)
157159
else:
158-
self.createRpm(name, version, release, depends, postinst, install, content, arch, provides)
160+
self.createRpm(name, version, release, depends, postinst, install=install, content=content, arch=arch, provides=provides)
159161
if updateinfo:
160162
self.updateInfo[name, version, release] = updateinfo
161163

162-
def createDeb(self, name, version, depends, postinst, install, content, arch, provides):
164+
def createDeb(self, name: str, version: str, depends: str, postinst: str | None = None, *, install: bool,
165+
content: Mapping[str, Mapping[str, str] | str] | None = None, arch: str | None = None, provides: str | None = None) -> None:
163166
"""Create a dummy deb in repo_dir on self.machine
164167
165168
If install is True, install the package. Otherwise, update the package
@@ -178,7 +181,7 @@ def createDeb(self, name, version, depends, postinst, install, content, arch, pr
178181
for path, data in content.items():
179182
dest = "/tmp/b/" + path
180183
m.execute(f"mkdir -p '{os.path.dirname(dest)}'")
181-
if isinstance(data, dict):
184+
if isinstance(data, Mapping):
182185
m.execute(f"cp '{data['path']}' '{dest}'")
183186
else:
184187
m.write(dest, data)
@@ -206,7 +209,8 @@ def createDeb(self, name, version, depends, postinst, install, content, arch, pr
206209
m.execute(cmd)
207210
self.addCleanup(m.execute, f"dpkg -P --force-depends --force-remove-reinstreq {name} 2>/dev/null || true")
208211

209-
def createRpm(self, name, version, release, requires, post, install, content, arch, provides):
212+
def createRpm(self, name: str, version: str, release: str, requires: str, post: str | None = None, *, install: bool,
213+
content: Mapping[str, Mapping[str, str] | str] | None = None, arch: str | None = None, provides: str | None = None) -> None:
210214
"""Create a dummy rpm in repo_dir on self.machine
211215
212216
If install is True, install the package. Otherwise, update the package
@@ -225,7 +229,7 @@ def createRpm(self, name, version, release, requires, post, install, content, ar
225229
if content is not None:
226230
for path, data in content.items():
227231
installcmds += f'mkdir -p $(dirname "$RPM_BUILD_ROOT/{path}")\n'
228-
if isinstance(data, dict):
232+
if isinstance(data, Mapping):
229233
installcmds += f"cp {data['path']} \"$RPM_BUILD_ROOT/{path}\""
230234
else:
231235
installcmds += f'cat >"$RPM_BUILD_ROOT/{path}" <<\'EOF\'\n' + data + '\nEOF\n'
@@ -267,7 +271,8 @@ def createRpm(self, name, version, release, requires, post, install, content, ar
267271
self.machine.execute(cmd.format(self.repo_dir, name, version, release, arch))
268272
self.addCleanup(self.machine.execute, f"rpm -e --nodeps {name} 2>/dev/null || true")
269273

270-
def createPacmanPkg(self, name, version, release, requires, postinst, install, content, arch, provides):
274+
def createPacmanPkg(self, name: str, version: str, release: str, requires: str, postinst: str | None = None, *, install: bool,
275+
content: Mapping[str, Mapping[str, str] | str] | None = None, arch: str | None = None, provides: str | None = None) -> None:
271276
"""Create a dummy pacman package in repo_dir on self.machine
272277
273278
If install is True, install the package. Otherwise, update the package
@@ -285,7 +290,7 @@ def createPacmanPkg(self, name, version, release, requires, postinst, install, c
285290
for path, data in content.items():
286291
p = os.path.dirname(path)
287292
installcmds += f'mkdir -p $pkgdir{p}\n'
288-
if isinstance(data, dict):
293+
if isinstance(data, Mapping):
289294
dpath = data["path"]
290295

291296
file = os.path.basename(dpath)
@@ -348,7 +353,7 @@ def createPacmanPkg(self, name, version, release, requires, postinst, install, c
348353
self.machine.execute(cmd)
349354
self.addCleanup(self.machine.execute, f"pacman -Rdd --noconfirm {name} 2>/dev/null || true")
350355

351-
def createAptChangelogs(self):
356+
def createAptChangelogs(self) -> None:
352357
# apt metadata has no formal field for bugs/CVEs, they are parsed from the changelog
353358
for ((pkg, ver, rel), info) in self.updateInfo.items():
354359
changes = info.get("changes", "some changes")
@@ -366,7 +371,7 @@ def createAptChangelogs(self):
366371
"""
367372
self.machine.execute(f"mkdir -p $(dirname {path}); echo '{contents}' > {path}")
368373

369-
def createYumUpdateInfo(self):
374+
def createYumUpdateInfo(self) -> str:
370375
xml = '<?xml version="1.0" encoding="UTF-8"?>\n<updates>\n'
371376
for ((pkg, ver, rel), info) in self.updateInfo.items():
372377
refs = ""
@@ -402,10 +407,10 @@ def createYumUpdateInfo(self):
402407
xml += '</updates>\n'
403408
return xml
404409

405-
def addPackageSet(self, name):
410+
def addPackageSet(self, name: str) -> None:
406411
self.machine.execute(f"mkdir -p {self.repo_dir}; cp /var/lib/package-sets/{name}/* {self.repo_dir}")
407412

408-
def enableRepo(self):
413+
def enableRepo(self) -> None:
409414
if self.backend == "apt":
410415
self.createAptChangelogs()
411416
self.machine.execute(f"""echo 'deb [trusted=yes] file://{self.repo_dir} /' > /etc/apt/sources.list.d/test.list

0 commit comments

Comments
 (0)