From 6cb4d7f0d516a5532afa8c39fc8c9bad6d9bd22b Mon Sep 17 00:00:00 2001 From: Adam Dangoor Date: Tue, 19 May 2026 13:03:19 +0100 Subject: [PATCH] Use assert_never for enum fallbacks --- pyproject.toml | 1 + src/mock_vws/_flask_server/target_manager.py | 15 +++++++++------ src/mock_vws/_flask_server/vwq.py | 11 ++++++----- src/mock_vws/_flask_server/vws.py | 11 ++++++----- 4 files changed, 22 insertions(+), 16 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 57809860f..2b3a15263 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -385,6 +385,7 @@ run.patch = [ "subprocess" ] run.relative_files = true run.source = [ "ci/", "src/", "tests/" ] report.exclude_also = [ + "case _ as unreachable:\n\\s*assert_never\\(", "class .*\\bProtocol\\):", "if TYPE_CHECKING:", ] diff --git a/src/mock_vws/_flask_server/target_manager.py b/src/mock_vws/_flask_server/target_manager.py index dcdced8ec..cdcb07215 100644 --- a/src/mock_vws/_flask_server/target_manager.py +++ b/src/mock_vws/_flask_server/target_manager.py @@ -6,6 +6,7 @@ import json from enum import StrEnum, auto from http import HTTPMethod, HTTPStatus +from typing import assert_never from zoneinfo import ZoneInfo from beartype import beartype @@ -37,17 +38,19 @@ class _TargetRaterChoice(StrEnum): PERFECT = auto() RANDOM = auto() - def to_target_rater(self) -> TargetTrackingRater: + def to_target_rater( + self: _TargetRaterChoice, + ) -> TargetTrackingRater: """Get the target rater.""" match self: - case self.BRISQUE: + case _TargetRaterChoice.BRISQUE: return BrisqueTargetTrackingRater() - case self.PERFECT: + case _TargetRaterChoice.PERFECT: return HardcodedTargetTrackingRater(rating=5) - case self.RANDOM: + case _TargetRaterChoice.RANDOM: return RandomTargetTrackingRater() - case _: # pragma: no cover - raise ValueError + case _ as unreachable: + assert_never(unreachable) @beartype diff --git a/src/mock_vws/_flask_server/vwq.py b/src/mock_vws/_flask_server/vwq.py index 4fb1e75c1..79b8252a5 100644 --- a/src/mock_vws/_flask_server/vwq.py +++ b/src/mock_vws/_flask_server/vwq.py @@ -8,6 +8,7 @@ import time from enum import StrEnum, auto from http import HTTPMethod, HTTPStatus +from typing import assert_never import requests from beartype import beartype @@ -39,15 +40,15 @@ class _ImageMatcherChoice(StrEnum): EXACT = auto() STRUCTURAL_SIMILARITY = auto() - def to_image_matcher(self) -> ImageMatcher: + def to_image_matcher(self: _ImageMatcherChoice) -> ImageMatcher: """Get the image matcher.""" match self: - case self.EXACT: + case _ImageMatcherChoice.EXACT: return ExactMatcher() - case self.STRUCTURAL_SIMILARITY: + case _ImageMatcherChoice.STRUCTURAL_SIMILARITY: return StructuralSimilarityMatcher() - case _: # pragma: no cover - raise ValueError + case _ as unreachable: + assert_never(unreachable) @beartype diff --git a/src/mock_vws/_flask_server/vws.py b/src/mock_vws/_flask_server/vws.py index 57942cb20..9595a4a96 100644 --- a/src/mock_vws/_flask_server/vws.py +++ b/src/mock_vws/_flask_server/vws.py @@ -12,6 +12,7 @@ import uuid from enum import StrEnum, auto from http import HTTPMethod, HTTPStatus +from typing import assert_never import requests from beartype import beartype @@ -62,15 +63,15 @@ class _ImageMatcherChoice(StrEnum): EXACT = auto() STRUCTURAL_SIMILARITY = auto() - def to_image_matcher(self) -> ImageMatcher: + def to_image_matcher(self: _ImageMatcherChoice) -> ImageMatcher: """Get the image matcher.""" match self: - case self.EXACT: + case _ImageMatcherChoice.EXACT: return ExactMatcher() - case self.STRUCTURAL_SIMILARITY: + case _ImageMatcherChoice.STRUCTURAL_SIMILARITY: return StructuralSimilarityMatcher() - case _: # pragma: no cover - raise ValueError + case _ as unreachable: + assert_never(unreachable) @beartype