Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,31 @@ jobs:
version: PATH
project: ./pyrightconfig.testcases.json

run-pyrefly:
timeout-minutes: 10
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ['3.12']
fail-fast: false
steps:
- uses: actions/checkout@v5
- name: Install uv
uses: astral-sh/setup-uv@v7
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}

- name: Install dependencies
run: uv sync --no-dev --group pyrefly

- name: Add venv to path
run: echo "$PWD/.venv/bin" >> $GITHUB_PATH

- name: Run pyrefly on the test cases
run: pyrefly check tests/assert_type

matrix-test:
timeout-minutes: 10
runs-on: ubuntu-latest
Expand Down
4 changes: 4 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,14 @@ tests = [
pyright = [
"pyright==1.1.407",
]
pyrefly = [
"pyrefly==0.43.0",
]

dev = [
{include-group = "tests"},
{include-group = "pyright"},
{include-group = "pyrefly"},
]

[project.urls]
Expand Down
2 changes: 2 additions & 0 deletions pyrefly.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Respect only `# pyrefly: ignore` (ignore `# type: ignore`)
enabled-ignores = ["pyrefly"]
4 changes: 2 additions & 2 deletions tests/assert_type/apps/test_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,15 @@ class BarConfig(AppConfig):
name = "foo"

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


class BazConfig(AppConfig):
name = "foo"

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


Expand Down
4 changes: 2 additions & 2 deletions tests/assert_type/db/models/test_constraints.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@
UniqueConstraint(Lower("name").desc(), "category", name="unique_lower_name_category")
UniqueConstraint(fields=["name"], name="unique_name")
# There's no overload case for passing both expression and 'fields'
UniqueConstraint( # type: ignore[call-overload]
UniqueConstraint( # type: ignore[call-overload] # pyrefly: ignore[no-matching-overload]
Lower("name"),
fields=["name"], # pyright: ignore[reportArgumentType]
name="unique_mess",
)

CheckConstraint( # type: ignore[deprecated] # pyright: ignore[reportDeprecated]
CheckConstraint( # type: ignore[deprecated] # pyright: ignore[reportDeprecated] # pyrefly: ignore[deprecated]
name="less_than_constraint",
check=LessThan[Any](F("months"), 1),
)
33 changes: 27 additions & 6 deletions tests/assert_type/db/models/test_enums.py
Original file line number Diff line number Diff line change
Expand Up @@ -227,12 +227,26 @@ class Joker(TextChoices):
# Note: Suppress errors from pyright as the mypy plugin narrows the type of labels if non-lazy.
assert_type(VoidChoices.names, list[str])
assert_type(VoidChoices.labels, list[str]) # pyright: ignore[reportAssertTypeFailure]
assert_type(VoidChoices.values, list[Any | None]) # pyright: ignore[reportAssertTypeFailure]
assert_type(VoidChoices.choices, list[tuple[Any | None, str]]) # pyright: ignore[reportAssertTypeFailure]

assert_type(VoidChoices.values, list[int | None]) # type: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure]
assert_type(
VoidChoices.values, # pyrefly: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure]
list[Any | None],
)

assert_type(VoidChoices.choices, list[tuple[int | None, str]]) # type: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure]
assert_type(
VoidChoices.choices, # pyrefly: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure]
list[tuple[Any | None, str]],
)

assert_type(VoidChoices.ABYSS, Literal[VoidChoices.ABYSS])
assert_type(VoidChoices.ABYSS.name, Literal["ABYSS"])
assert_type(VoidChoices.ABYSS.label, str) # pyright: ignore[reportAssertTypeFailure]
assert_type(VoidChoices.ABYSS.value, Any)

assert_type(VoidChoices.ABYSS.value, int) # type: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure]
assert_type(VoidChoices.ABYSS.value, Any) # pyrefly: ignore[assert-type]

assert_type(VoidChoices.ABYSS.do_not_call_in_templates, Literal[True])
assert_type(VoidChoices.__empty__, str) # pyright: ignore[reportAssertTypeFailure]

Expand Down Expand Up @@ -274,7 +288,10 @@ class Joker(TextChoices):

# Assertions for mixing multiple choices types with consistent base types - only `TextChoices`.
x1 = (Medal, Gender)
assert_type([member.label for choices in x1 for member in choices], list[_StrOrPromise])

assert_type([member.label for choices in x1 for member in choices], list[str]) # type: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure]
assert_type([member.label for choices in x1 for member in choices], list[_StrOrPromise]) # pyrefly: ignore[assert-type]

assert_type([member.value for choices in x1 for member in choices], list[str])

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

# Assertions for mixing multiple choices types with consistent base types - custom types.
x3 = (Constants, Separator)
assert_type([member.label for choices in x3 for member in choices], list[_StrOrPromise])
assert_type([member.value for choices in x3 for member in choices], list[Any])

assert_type([member.label for choices in x3 for member in choices], list[str]) # type: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure]
assert_type([member.label for choices in x3 for member in choices], list[_StrOrPromise]) # pyrefly: ignore[assert-type]

assert_type([member.value for choices in x3 for member in choices], list[bytes | float]) # type: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure]
assert_type([member.value for choices in x3 for member in choices], list[Any]) # pyrefly: ignore[assert-type]


# Assertions for choices objects defined and aliased in a model.
Expand Down
16 changes: 8 additions & 8 deletions tests/assert_type/db/models/test_ordering.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,21 +35,21 @@
)

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

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

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

query.add_extra(
select=None,
select_params=None,
where=None,
params=None,
tables=None,
order_by=[123, "username"], # type: ignore[list-item] # pyright: ignore[reportArgumentType]
order_by=[123, "username"], # type: ignore[list-item] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type]
)
12 changes: 6 additions & 6 deletions tests/assert_type/forms/test_add_error.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@
assert_type(form.add_error("field", ValidationError(["error"])), None)
assert_type(form.add_error(None, ValidationError({"field": "error"})), None)

form.add_error("field", {"field": "error"}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType]
form.add_error("field", {"field": lazystr("error")}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType]
form.add_error("field", {"field": ValidationError("error")}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType]
form.add_error("field", {"field": ["error"]}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType]
form.add_error("field", {"field": [lazystr("error")]}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType]
form.add_error("field", {"field": [ValidationError("error")]}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType]
form.add_error("field", {"field": "error"}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload]
form.add_error("field", {"field": lazystr("error")}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload]
form.add_error("field", {"field": ValidationError("error")}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload]
form.add_error("field", {"field": ["error"]}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload]
form.add_error("field", {"field": [lazystr("error")]}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload]
form.add_error("field", {"field": [ValidationError("error")]}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload]
2 changes: 1 addition & 1 deletion tests/assert_type/http/test_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
# Test MutableQueryDict
mut_q = QueryDict(mutable=True)
mut_q["a"] = "3"
mut_q["a"] = ["1", "2"] # type: ignore[assignment] # pyright: ignore[reportArgumentType]
mut_q["a"] = ["1", "2"] # type: ignore[assignment] # pyright: ignore[reportArgumentType] # pyrefly: ignore[unsupported-operation]

assert_type(mut_q.pop("a"), list[str])
assert_type(mut_q.pop("a", 12), list[str] | int)
Expand Down
8 changes: 4 additions & 4 deletions tests/assert_type/middleware/test_middleware.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,15 @@ class CustomCommonMiddleware(CommonMiddleware):


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


class CustomLocaleMiddleware(LocaleMiddleware):
response_redirect_class = HttpResponseRedirect


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


class CustomRedirectFallbackMiddleware(RedirectFallbackMiddleware):
Expand All @@ -38,5 +38,5 @@ class CustomRedirectFallbackMiddleware2(RedirectFallbackMiddleware):


class BrokenCustomRedirectFallbackMiddleware(RedirectFallbackMiddleware):
response_redirect_class = HttpResponse # type:ignore[assignment] # pyright: ignore[reportAssignmentType]
response_gone_class = 12 # type:ignore[assignment] # pyright: ignore[reportAssignmentType]
response_redirect_class = HttpResponse # type:ignore[assignment] # pyright: ignore[reportAssignmentType] # pyrefly: ignore[bad-assignment]
response_gone_class = 12 # type:ignore[assignment] # pyright: ignore[reportAssignmentType] # pyrefly: ignore[bad-assignment]
22 changes: 22 additions & 0 deletions uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading