From d96ece5425290fc171df6aa3550a7ca49bff21b7 Mon Sep 17 00:00:00 2001 From: Gavin Panella Date: Tue, 22 Jul 2025 10:15:07 +0200 Subject: [PATCH 1/2] Preserve type through call to `Fixture.useFixture` --- testtools/testcase.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/testtools/testcase.py b/testtools/testcase.py index c20dd5a3..2ec2296a 100644 --- a/testtools/testcase.py +++ b/testtools/testcase.py @@ -21,6 +21,7 @@ import sys import types import unittest +from typing import Any, Protocol, TypeVar from unittest.case import SkipTest from testtools import content @@ -168,6 +169,15 @@ def gather_details(source_dict, target_dict): fixtures = try_import("fixtures") +class UseFixtureProtocol(Protocol): + def setUp(self) -> Any: ... + def cleanUp(self) -> Any: ... + def getDetails(self) -> dict[str, content.Content]: ... + + +UseFixtureT = TypeVar("UseFixtureT", bound=UseFixtureProtocol) + + def _mods(i, mod): (q, r) = divmod(i, mod) while True: @@ -729,7 +739,7 @@ def _run_test_method(self, result): """ return self._get_test_method()() - def useFixture(self, fixture): + def useFixture(self, fixture: UseFixtureT) -> UseFixtureT: """Use fixture in a test case. The fixture will be setUp, and self.addCleanup(fixture.cleanUp) called. From 2ca1eba4a341a87eb6791538c35e42fc9987937c Mon Sep 17 00:00:00 2001 From: Gavin Panella Date: Tue, 22 Jul 2025 10:16:15 +0200 Subject: [PATCH 2/2] Mark `reraise` as `NoReturn` --- testtools/compat.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/testtools/compat.py b/testtools/compat.py index 9dd90b8c..5db6d7eb 100644 --- a/testtools/compat.py +++ b/testtools/compat.py @@ -16,13 +16,14 @@ import locale import os import sys +import typing import unicodedata # Ensure retro-compatibility with older testtools releases from io import BytesIO, StringIO -def reraise(exc_class, exc_obj, exc_tb, _marker=object()): +def reraise(exc_class, exc_obj, exc_tb, _marker=object()) -> typing.NoReturn: """Re-raise an exception received from sys.exc_info() or similar.""" raise exc_obj.with_traceback(exc_tb)