Skip to content

Commit e896a4e

Browse files
Remove pyrefly 1897 workarounds and use the strict preset (#3567)
* Remove workarounds for closed pyrefly issue 1897 pyrefly 1.2.0 supports copy.replace, so the explicit annotations and ignore comments are no longer needed. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * Make pyrefly error on unused ignore comments Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * Use the pyrefly strict preset The strict preset enables unused-ignore along with implicit-any, missing-override-decorator and other checks. Fix the new errors: add @OverRide decorators, replace an untyped lambda sort key with a typed function, and type two empty containers. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
1 parent 359d5a3 commit e896a4e

8 files changed

Lines changed: 35 additions & 28 deletions

File tree

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,7 @@ search_path = [
454454
"src",
455455
]
456456
errors.non-exhaustive-match = "error"
457+
preset = "strict"
457458

458459
[tool.pyright]
459460
typeCheckingMode = "strict"

src/mock_vws/_flask_server/target_manager.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -787,9 +787,8 @@ def delete_target(database_name: str, target_id: str) -> Response:
787787

788788
target = database.get_target(target_id=target_id)
789789
now = datetime.datetime.now(tz=target.upload_date.tzinfo)
790-
# See https://github.com/facebook/pyrefly/issues/1897
791-
new_target: ImageTarget = copy.replace(
792-
target, # pyrefly: ignore[bad-argument-type]
790+
new_target = copy.replace(
791+
target,
793792
delete_date=now,
794793
)
795794
database.targets.remove(target)
@@ -831,9 +830,8 @@ def update_target(database_name: str, target_id: str) -> Response:
831830
image_value = target.image_value
832831
if "image" in request_json:
833832
image_value = base64.b64decode(s=request_json["image"])
834-
# See https://github.com/facebook/pyrefly/issues/1897
835-
new_target: ImageTarget = copy.replace(
836-
target, # pyrefly: ignore[bad-argument-type]
833+
new_target = copy.replace(
834+
target,
837835
name=name,
838836
width=width,
839837
active_flag=active_flag,
@@ -891,9 +889,8 @@ def set_target_recognition_counts(
891889

892890
target = database.get_target(target_id=target_id)
893891

894-
# See https://github.com/facebook/pyrefly/issues/1897
895-
new_target: ImageTarget = copy.replace(
896-
target, # pyrefly: ignore[bad-argument-type]
892+
new_target = copy.replace(
893+
target,
897894
current_month_recos=request_json.get(
898895
"current_month_recos",
899896
target.current_month_recos,

src/mock_vws/_httpx2_mock_server/decorators.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import re
1111
from collections.abc import Callable, Mapping, Sequence
1212
from dataclasses import dataclass
13-
from typing import Protocol
13+
from typing import Protocol, override
1414
from unittest import mock
1515
from urllib.parse import urlparse
1616

@@ -173,6 +173,7 @@ def __init__(
173173
self._fakes = fakes
174174
self._wrapped = wrapped
175175

176+
@override
176177
def handle_request(self, request: httpx2.Request) -> httpx2.Response:
177178
"""Handle a request from a synchronous ``httpx2`` client.
178179
@@ -217,6 +218,7 @@ def __init__(
217218
self._fakes = fakes
218219
self._wrapped = wrapped
219220

221+
@override
220222
async def handle_async_request(
221223
self,
222224
request: httpx2.Request,

src/mock_vws/_mock_common.py

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
"""Common utilities for creating mock routes."""
22

3+
import datetime
34
import email.utils
45
import json
56
import uuid
67
from collections.abc import Iterable, Mapping
78
from dataclasses import dataclass
8-
from typing import Any
9+
from typing import Any, override
910

1011
from beartype import beartype
1112

@@ -34,6 +35,7 @@ def __init__(self, url: str) -> None:
3435
super().__init__()
3536
self.url = url
3637

38+
@override
3739
def __str__(self) -> str:
3840
"""
3941
Give a string representation of this error with a
@@ -80,6 +82,19 @@ class Route:
8082
http_methods: Iterable[str]
8183

8284

85+
@beartype
86+
def _upload_order_key(target: ImageTarget) -> tuple[datetime.datetime, str]:
87+
"""Give the sort key which orders targets by upload date, then ID.
88+
89+
Args:
90+
target: The target to give a sort key for.
91+
92+
Returns:
93+
The target's upload date and ID.
94+
"""
95+
return (target.upload_date, target.target_id)
96+
97+
8398
@beartype
8499
def sorted_targets(*, targets: Iterable[ImageTarget]) -> list[ImageTarget]:
85100
"""Put targets into a deterministic order.
@@ -94,10 +109,7 @@ def sorted_targets(*, targets: Iterable[ImageTarget]) -> list[ImageTarget]:
94109
Returns:
95110
The given targets, ordered by upload date and then by target ID.
96111
"""
97-
return sorted(
98-
targets,
99-
key=lambda target: (target.upload_date, target.target_id),
100-
)
112+
return sorted(targets, key=_upload_order_key)
101113

102114

103115
@beartype

src/mock_vws/_model_target_web_api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1335,7 +1335,7 @@ def _validate_dataset_request(
13351335
for model in models:
13361336
if isinstance(model.get("views"), list):
13371337
model["views"] = [
1338-
view if isinstance(view, dict) else {}
1338+
view if isinstance(view, dict) else dict[str, Any]()
13391339
for view in model["views"]
13401340
]
13411341
details = (

src/mock_vws/_requests_mock_server/mock_web_services_api.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -624,9 +624,8 @@ def delete_target(self, request: RequestData) -> _ResponseType:
624624
)
625625

626626
now = datetime.datetime.now(tz=target.upload_date.tzinfo)
627-
# See https://github.com/facebook/pyrefly/issues/1897
628-
new_target: ImageTarget = copy.replace(
629-
target, # pyrefly: ignore[bad-argument-type]
627+
new_target = copy.replace(
628+
target,
630629
delete_date=now,
631630
)
632631
database.targets.remove(target)
@@ -1039,9 +1038,8 @@ def update_target(self, request: RequestData) -> _ResponseType:
10391038
fail_exception.response_text,
10401039
)
10411040

1042-
# See https://github.com/facebook/pyrefly/issues/1897
1043-
new_target: ImageTarget = copy.replace(
1044-
target, # pyrefly: ignore[bad-argument-type]
1041+
new_target = copy.replace(
1042+
target,
10451043
name=name,
10461044
width=width,
10471045
active_flag=active_flag,

src/mock_vws/decorators.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
ModelTargetGenerationFailure,
3939
ModelTargetGenerationWarning,
4040
)
41-
from mock_vws.target import ImageTarget
4241
from mock_vws.target_manager import TargetManager
4342
from mock_vws.target_raters import (
4443
BrisqueTargetTrackingRater,
@@ -377,10 +376,8 @@ def set_target_recognition_counts(
377376
for cloud_database, target in matches:
378377
# Recognizing a target does not change it, so the target's
379378
# last modified date is not changed here.
380-
#
381-
# See https://github.com/facebook/pyrefly/issues/1897
382-
new_target: ImageTarget = copy.replace(
383-
target, # pyrefly: ignore[bad-argument-type]
379+
new_target = copy.replace(
380+
target,
384381
current_month_recos=(
385382
target.current_month_recos
386383
if current_month_recos is None

tests/mock_vws/test_model_target_web_api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2394,7 +2394,7 @@ def test_client_credential_authentication_errors() -> None:
23942394
"""Credential-management routes enforce bearer-token validity and
23952395
scope.
23962396
"""
2397-
headers = [
2397+
headers: list[dict[str, str]] = [
23982398
{},
23992399
{"Authorization": "Bearer malformed"},
24002400
{"Authorization": "Bearer e30.e30.signature"},

0 commit comments

Comments
 (0)