Skip to content

Commit 4be74b8

Browse files
committed
Start using beartype across the library
1 parent c483b46 commit 4be74b8

37 files changed

+154
-40
lines changed

ci/custom_linters.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66

77
import pytest
88
import yaml
9+
from beartype import beartype
910

1011

12+
@beartype
1113
def _ci_patterns(*, repository_root: Path) -> set[str]:
1214
"""
1315
Return the CI patterns given in the CI configuration file.
@@ -21,6 +23,7 @@ def _ci_patterns(*, repository_root: Path) -> set[str]:
2123
return ci_patterns
2224

2325

26+
@beartype
2427
def _tests_from_pattern(
2528
*,
2629
ci_pattern: str,

conftest.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from tests.mock_vws.utils.retries import RETRY_EXCEPTIONS
1414

1515

16+
@beartype
1617
def pytest_collection_modifyitems(items: list[pytest.Item]) -> None:
1718
"""
1819
Apply the beartype decorator to all collected test functions.
@@ -32,6 +33,7 @@ def pytest_collection_modifyitems(items: list[pytest.Item]) -> None:
3233

3334

3435
@pytest.hookimpl(optionalhook=True)
36+
@beartype
3537
def pytest_set_filtered_exceptions() -> tuple[type[Exception], ...]:
3638
"""
3739
Return exceptions to retry on.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ dynamic = [
3636
"version",
3737
]
3838
dependencies = [
39+
"beartype",
3940
"flask",
4041
# Pin numpy to avoid:
4142
# https://github.com/pytorch/pytorch/issues/128860
@@ -53,7 +54,6 @@ dependencies = [
5354
]
5455
optional-dependencies.dev = [
5556
"actionlint-py==1.7.1.15",
56-
"beartype==0.18.5",
5757
"check-manifest==0.49",
5858
"check-wheel-contents==0.6.0",
5959
"deptry==0.20.0",

src/mock_vws/_base64_decoding.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66
import binascii
77
import string
88

9+
from beartype import beartype
910

11+
12+
@beartype
1013
def decode_base64(encoded_data: str) -> bytes:
1114
"""
1215
Decode base64 somewhat like Vuforia does.

src/mock_vws/_database_matchers.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,16 @@
22
Helpers for getting databases which match keys given in requests.
33
"""
44

5-
from __future__ import annotations
6-
7-
from typing import TYPE_CHECKING
5+
from collections.abc import Iterable, Mapping
86

97
from vws_auth_tools import authorization_header
108

11-
if TYPE_CHECKING:
12-
from collections.abc import Iterable
13-
14-
from mock_vws.database import VuforiaDatabase
9+
from mock_vws.database import VuforiaDatabase
1510

1611

1712
def get_database_matching_client_keys(
1813
*,
19-
request_headers: dict[str, str],
14+
request_headers: Mapping[str, str],
2015
request_body: bytes | None,
2116
request_method: str,
2217
request_path: str,

src/mock_vws/_flask_server/vws.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from http import HTTPMethod, HTTPStatus
1515

1616
import requests
17+
from beartype import beartype
1718
from flask import Flask, Response, request
1819
from pydantic_settings import BaseSettings
1920

@@ -117,6 +118,7 @@ def set_terminate_wsgi_input() -> None:
117118

118119

119120
@VWS_FLASK_APP.before_request
121+
@beartype
120122
def validate_request() -> None:
121123
"""
122124
Run validators on the request.

src/mock_vws/_mock_common.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
from dataclasses import dataclass
77
from typing import Any
88

9+
from beartype import beartype
10+
911

1012
@dataclass(frozen=True)
1113
class Route:
@@ -24,6 +26,7 @@ class Route:
2426
http_methods: frozenset[str]
2527

2628

29+
@beartype
2730
def json_dump(*, body: dict[str, Any]) -> str:
2831
"""
2932
Returns:

src/mock_vws/_query_tools.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,28 @@
22
Tools for making Vuforia queries.
33
"""
44

5-
from __future__ import annotations
6-
75
import base64
86
import io
97
import uuid
8+
from collections.abc import Mapping
109
from email.message import EmailMessage
11-
from typing import TYPE_CHECKING, Any
10+
from typing import Any
1211

12+
from beartype import beartype
1313
from werkzeug.formparser import MultiPartParser
1414

1515
from mock_vws._base64_decoding import decode_base64
1616
from mock_vws._constants import ResultCodes, TargetStatuses
1717
from mock_vws._database_matchers import get_database_matching_client_keys
1818
from mock_vws._mock_common import json_dump
19-
20-
if TYPE_CHECKING:
21-
from mock_vws.database import VuforiaDatabase
22-
from mock_vws.image_matchers import ImageMatcher
19+
from mock_vws.database import VuforiaDatabase
20+
from mock_vws.image_matchers import ImageMatcher
2321

2422

23+
@beartype
2524
def get_query_match_response_text(
2625
*,
27-
request_headers: dict[str, str],
26+
request_headers: Mapping[str, str],
2827
request_body: bytes,
2928
request_method: str,
3029
request_path: str,

src/mock_vws/_query_validators/accept_header_validators.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@
44

55
import logging
66

7+
from beartype import beartype
8+
79
from mock_vws._query_validators.exceptions import InvalidAcceptHeaderError
810

911
_LOGGER = logging.getLogger(name=__name__)
1012

1113

14+
@beartype
1215
def validate_accept_header(request_headers: dict[str, str]) -> None:
1316
"""
1417
Validate the accept header.

src/mock_vws/_query_validators/auth_validators.py

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,24 @@
22
Authorization validators to use in the mock query API.
33
"""
44

5-
from __future__ import annotations
6-
75
import logging
8-
from typing import TYPE_CHECKING
6+
from collections.abc import Mapping
7+
8+
from beartype import beartype
99

1010
from mock_vws._database_matchers import get_database_matching_client_keys
1111
from mock_vws._query_validators.exceptions import (
1212
AuthenticationFailureError,
1313
AuthHeaderMissingError,
1414
MalformedAuthHeaderError,
1515
)
16+
from mock_vws.database import VuforiaDatabase
1617

1718
_LOGGER = logging.getLogger(name=__name__)
1819

19-
if TYPE_CHECKING:
20-
from mock_vws.database import VuforiaDatabase
21-
2220

23-
def validate_auth_header_exists(*, request_headers: dict[str, str]) -> None:
21+
@beartype
22+
def validate_auth_header_exists(*, request_headers: Mapping[str, str]) -> None:
2423
"""
2524
Validate that there is an authorization header given to the query endpoint.
2625
@@ -37,9 +36,10 @@ def validate_auth_header_exists(*, request_headers: dict[str, str]) -> None:
3736
raise AuthHeaderMissingError
3837

3938

39+
@beartype
4040
def validate_auth_header_number_of_parts(
4141
*,
42-
request_headers: dict[str, str],
42+
request_headers: Mapping[str, str],
4343
) -> None:
4444
"""
4545
Validate the authorization header includes text either side of a space.
@@ -61,9 +61,10 @@ def validate_auth_header_number_of_parts(
6161
raise MalformedAuthHeaderError
6262

6363

64+
@beartype
6465
def validate_client_key_exists(
6566
*,
66-
request_headers: dict[str, str],
67+
request_headers: Mapping[str, str],
6768
databases: set[VuforiaDatabase],
6869
) -> None:
6970
"""
@@ -87,8 +88,9 @@ def validate_client_key_exists(
8788
raise AuthenticationFailureError
8889

8990

91+
@beartype
9092
def validate_auth_header_has_signature(
91-
request_headers: dict[str, str],
93+
request_headers: Mapping[str, str],
9294
) -> None:
9395
"""
9496
Validate the authorization header includes a signature.
@@ -107,10 +109,11 @@ def validate_auth_header_has_signature(
107109
raise MalformedAuthHeaderError
108110

109111

112+
@beartype
110113
def validate_authorization(
111114
*,
112115
request_path: str,
113-
request_headers: dict[str, str],
116+
request_headers: Mapping[str, str],
114117
request_body: bytes,
115118
request_method: str,
116119
databases: set[VuforiaDatabase],

0 commit comments

Comments
 (0)