Skip to content

Commit 24d277c

Browse files
Run pyrefly over test cases (#2914)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent f3c9b95 commit 24d277c

File tree

11 files changed

+103
-29
lines changed

11 files changed

+103
-29
lines changed

.github/workflows/test.yml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,31 @@ jobs:
171171
version: PATH
172172
project: ./pyrightconfig.testcases.json
173173

174+
run-pyrefly:
175+
timeout-minutes: 10
176+
runs-on: ubuntu-latest
177+
strategy:
178+
matrix:
179+
python-version: ['3.12']
180+
fail-fast: false
181+
steps:
182+
- uses: actions/checkout@v5
183+
- name: Install uv
184+
uses: astral-sh/setup-uv@v7
185+
- name: Set up Python ${{ matrix.python-version }}
186+
uses: actions/setup-python@v6
187+
with:
188+
python-version: ${{ matrix.python-version }}
189+
190+
- name: Install dependencies
191+
run: uv sync --no-dev --group pyrefly
192+
193+
- name: Add venv to path
194+
run: echo "$PWD/.venv/bin" >> $GITHUB_PATH
195+
196+
- name: Run pyrefly on the test cases
197+
run: pyrefly check tests/assert_type
198+
174199
matrix-test:
175200
timeout-minutes: 10
176201
runs-on: ubuntu-latest

pyproject.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,14 @@ tests = [
6161
pyright = [
6262
"pyright==1.1.407",
6363
]
64+
pyrefly = [
65+
"pyrefly==0.43.0",
66+
]
6467

6568
dev = [
6669
{include-group = "tests"},
6770
{include-group = "pyright"},
71+
{include-group = "pyrefly"},
6872
]
6973

7074
[project.urls]

pyrefly.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# Respect only `# pyrefly: ignore` (ignore `# type: ignore`)
2+
enabled-ignores = ["pyrefly"]

tests/assert_type/apps/test_config.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@ class BarConfig(AppConfig):
1212
name = "foo"
1313

1414
@property
15-
def default_auto_field(self) -> str: # type: ignore[override]
15+
def default_auto_field(self) -> str: # type: ignore[override] # pyrefly: ignore[bad-override]
1616
return "django.db.models.BigAutoField"
1717

1818

1919
class BazConfig(AppConfig):
2020
name = "foo"
2121

2222
@cached_property
23-
def default_auto_field(self) -> str: # type: ignore[override]
23+
def default_auto_field(self) -> str: # type: ignore[override] # pyrefly: ignore[bad-override]
2424
return "django.db.models.BigAutoField"
2525

2626

tests/assert_type/db/models/test_constraints.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@
77
UniqueConstraint(Lower("name").desc(), "category", name="unique_lower_name_category")
88
UniqueConstraint(fields=["name"], name="unique_name")
99
# There's no overload case for passing both expression and 'fields'
10-
UniqueConstraint( # type: ignore[call-overload]
10+
UniqueConstraint( # type: ignore[call-overload] # pyrefly: ignore[no-matching-overload]
1111
Lower("name"),
1212
fields=["name"], # pyright: ignore[reportArgumentType]
1313
name="unique_mess",
1414
)
1515

16-
CheckConstraint( # type: ignore[deprecated] # pyright: ignore[reportDeprecated]
16+
CheckConstraint( # type: ignore[deprecated] # pyright: ignore[reportDeprecated] # pyrefly: ignore[deprecated]
1717
name="less_than_constraint",
1818
check=LessThan[Any](F("months"), 1),
1919
)

tests/assert_type/db/models/test_enums.py

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -227,12 +227,26 @@ class Joker(TextChoices):
227227
# Note: Suppress errors from pyright as the mypy plugin narrows the type of labels if non-lazy.
228228
assert_type(VoidChoices.names, list[str])
229229
assert_type(VoidChoices.labels, list[str]) # pyright: ignore[reportAssertTypeFailure]
230-
assert_type(VoidChoices.values, list[Any | None]) # pyright: ignore[reportAssertTypeFailure]
231-
assert_type(VoidChoices.choices, list[tuple[Any | None, str]]) # pyright: ignore[reportAssertTypeFailure]
230+
231+
assert_type(VoidChoices.values, list[int | None]) # type: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure]
232+
assert_type(
233+
VoidChoices.values, # pyrefly: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure]
234+
list[Any | None],
235+
)
236+
237+
assert_type(VoidChoices.choices, list[tuple[int | None, str]]) # type: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure]
238+
assert_type(
239+
VoidChoices.choices, # pyrefly: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure]
240+
list[tuple[Any | None, str]],
241+
)
242+
232243
assert_type(VoidChoices.ABYSS, Literal[VoidChoices.ABYSS])
233244
assert_type(VoidChoices.ABYSS.name, Literal["ABYSS"])
234245
assert_type(VoidChoices.ABYSS.label, str) # pyright: ignore[reportAssertTypeFailure]
235-
assert_type(VoidChoices.ABYSS.value, Any)
246+
247+
assert_type(VoidChoices.ABYSS.value, int) # type: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure]
248+
assert_type(VoidChoices.ABYSS.value, Any) # pyrefly: ignore[assert-type]
249+
236250
assert_type(VoidChoices.ABYSS.do_not_call_in_templates, Literal[True])
237251
assert_type(VoidChoices.__empty__, str) # pyright: ignore[reportAssertTypeFailure]
238252

@@ -274,7 +288,10 @@ class Joker(TextChoices):
274288

275289
# Assertions for mixing multiple choices types with consistent base types - only `TextChoices`.
276290
x1 = (Medal, Gender)
277-
assert_type([member.label for choices in x1 for member in choices], list[_StrOrPromise])
291+
292+
assert_type([member.label for choices in x1 for member in choices], list[str]) # type: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure]
293+
assert_type([member.label for choices in x1 for member in choices], list[_StrOrPromise]) # pyrefly: ignore[assert-type]
294+
278295
assert_type([member.value for choices in x1 for member in choices], list[str])
279296

280297
# Assertions for mixing multiple choices types with different base types - `IntegerChoices` and `TextChoices`.
@@ -284,8 +301,12 @@ class Joker(TextChoices):
284301

285302
# Assertions for mixing multiple choices types with consistent base types - custom types.
286303
x3 = (Constants, Separator)
287-
assert_type([member.label for choices in x3 for member in choices], list[_StrOrPromise])
288-
assert_type([member.value for choices in x3 for member in choices], list[Any])
304+
305+
assert_type([member.label for choices in x3 for member in choices], list[str]) # type: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure]
306+
assert_type([member.label for choices in x3 for member in choices], list[_StrOrPromise]) # pyrefly: ignore[assert-type]
307+
308+
assert_type([member.value for choices in x3 for member in choices], list[bytes | float]) # type: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure]
309+
assert_type([member.value for choices in x3 for member in choices], list[Any]) # pyrefly: ignore[assert-type]
289310

290311

291312
# Assertions for choices objects defined and aliased in a model.

tests/assert_type/db/models/test_ordering.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,21 +35,21 @@
3535
)
3636

3737
# failure cases
38-
qs.order_by(123) # type: ignore[arg-type] # pyright: ignore[reportArgumentType]
39-
qs.order_by(["username"]) # type: ignore[arg-type] # pyright: ignore[reportArgumentType]
40-
qs.order_by({"username": "asc"}) # type: ignore[arg-type] # pyright: ignore[reportArgumentType]
38+
qs.order_by(123) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type]
39+
qs.order_by(["username"]) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type]
40+
qs.order_by({"username": "asc"}) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type]
4141

42-
qs.extra(order_by=[123]) # type: ignore[list-item] # pyright: ignore[reportArgumentType]
43-
qs.extra(order_by=["username", 456]) # type: ignore[list-item] # pyright: ignore[reportArgumentType]
42+
qs.extra(order_by=[123]) # type: ignore[list-item] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type]
43+
qs.extra(order_by=["username", 456]) # type: ignore[list-item] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type]
4444

45-
query.add_ordering(123) # type: ignore[arg-type] # pyright: ignore[reportArgumentType]
46-
query.add_ordering(["username"]) # type: ignore[arg-type] # pyright: ignore[reportArgumentType]
45+
query.add_ordering(123) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type]
46+
query.add_ordering(["username"]) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type]
4747

4848
query.add_extra(
4949
select=None,
5050
select_params=None,
5151
where=None,
5252
params=None,
5353
tables=None,
54-
order_by=[123, "username"], # type: ignore[list-item] # pyright: ignore[reportArgumentType]
54+
order_by=[123, "username"], # type: ignore[list-item] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type]
5555
)

tests/assert_type/forms/test_add_error.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@
2727
assert_type(form.add_error("field", ValidationError(["error"])), None)
2828
assert_type(form.add_error(None, ValidationError({"field": "error"})), None)
2929

30-
form.add_error("field", {"field": "error"}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType]
31-
form.add_error("field", {"field": lazystr("error")}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType]
32-
form.add_error("field", {"field": ValidationError("error")}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType]
33-
form.add_error("field", {"field": ["error"]}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType]
34-
form.add_error("field", {"field": [lazystr("error")]}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType]
35-
form.add_error("field", {"field": [ValidationError("error")]}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType]
30+
form.add_error("field", {"field": "error"}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload]
31+
form.add_error("field", {"field": lazystr("error")}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload]
32+
form.add_error("field", {"field": ValidationError("error")}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload]
33+
form.add_error("field", {"field": ["error"]}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload]
34+
form.add_error("field", {"field": [lazystr("error")]}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload]
35+
form.add_error("field", {"field": [ValidationError("error")]}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload]

tests/assert_type/http/test_request.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
# Test MutableQueryDict
2828
mut_q = QueryDict(mutable=True)
2929
mut_q["a"] = "3"
30-
mut_q["a"] = ["1", "2"] # type: ignore[assignment] # pyright: ignore[reportArgumentType]
30+
mut_q["a"] = ["1", "2"] # type: ignore[assignment] # pyright: ignore[reportArgumentType] # pyrefly: ignore[unsupported-operation]
3131

3232
assert_type(mut_q.pop("a"), list[str])
3333
assert_type(mut_q.pop("a", 12), list[str] | int)

tests/assert_type/middleware/test_middleware.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,15 @@ class CustomCommonMiddleware(CommonMiddleware):
1616

1717

1818
class BrokenCustomCommonMiddleware(CommonMiddleware):
19-
response_redirect_class = FileResponse # type:ignore[assignment] # pyright: ignore[reportAssignmentType]
19+
response_redirect_class = FileResponse # type:ignore[assignment] # pyright: ignore[reportAssignmentType] # pyrefly: ignore[bad-assignment]
2020

2121

2222
class CustomLocaleMiddleware(LocaleMiddleware):
2323
response_redirect_class = HttpResponseRedirect
2424

2525

2626
class BrokenCustomLocaleMiddleware(CommonMiddleware):
27-
response_redirect_class = FileResponse # type:ignore[assignment] # pyright: ignore[reportAssignmentType]
27+
response_redirect_class = FileResponse # type:ignore[assignment] # pyright: ignore[reportAssignmentType] # pyrefly: ignore[bad-assignment]
2828

2929

3030
class CustomRedirectFallbackMiddleware(RedirectFallbackMiddleware):
@@ -38,5 +38,5 @@ class CustomRedirectFallbackMiddleware2(RedirectFallbackMiddleware):
3838

3939

4040
class BrokenCustomRedirectFallbackMiddleware(RedirectFallbackMiddleware):
41-
response_redirect_class = HttpResponse # type:ignore[assignment] # pyright: ignore[reportAssignmentType]
42-
response_gone_class = 12 # type:ignore[assignment] # pyright: ignore[reportAssignmentType]
41+
response_redirect_class = HttpResponse # type:ignore[assignment] # pyright: ignore[reportAssignmentType] # pyrefly: ignore[bad-assignment]
42+
response_gone_class = 12 # type:ignore[assignment] # pyright: ignore[reportAssignmentType] # pyrefly: ignore[bad-assignment]

0 commit comments

Comments
 (0)