Skip to content

Commit 8ba53c7

Browse files
authored
Add permissions.OperandHolder to decorators.permission_classes signature (#162)
* Add permissions.OperandHolder to decorators.permission_classes signature * Test decorators.permission_classes signature * Test decorators.permission_classes with operators
1 parent 7f69889 commit 8ba53c7

File tree

2 files changed

+19
-4
lines changed

2 files changed

+19
-4
lines changed

rest_framework-stubs/decorators.pyi

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ from typing import Any, Callable, List, Mapping, Optional, Sequence, Type, Union
33
from django.http.response import HttpResponseBase
44
from rest_framework.authentication import BaseAuthentication
55
from rest_framework.parsers import BaseParser
6-
from rest_framework.permissions import BasePermission
6+
from rest_framework.permissions import _PermissionClass
77
from rest_framework.renderers import BaseRenderer
88
from rest_framework.schemas.inspectors import ViewInspector
99
from rest_framework.throttling import BaseThrottle
@@ -75,9 +75,7 @@ def authentication_classes(
7575
def throttle_classes(
7676
throttle_classes: Sequence[Union[BaseThrottle, Type[BaseThrottle]]]
7777
) -> Callable[[_View], _View]: ...
78-
def permission_classes(
79-
permission_classes: Sequence[Union[BasePermission, Type[BasePermission]]]
80-
) -> Callable[[_View], _View]: ...
78+
def permission_classes(permission_classes: Sequence[_PermissionClass]) -> Callable[[_View], _View]: ...
8179
def schema(view_inspector: Optional[Union[ViewInspector, Type[ViewInspector]]]) -> Callable[[_View], _View]: ...
8280
def action(
8381
methods: Optional[_MIXED_CASE_HTTP_VERBS] = ...,

tests/typecheck/test_decorators.yml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,20 @@
2424
from rest_framework.decorators import api_view
2525
@api_view() # E: Value of type variable "_View" of function cannot be "Callable[[Any], List[Any]]"
2626
def view_func2(request) -> list: ...
27+
28+
- case: permission_classes
29+
main: |
30+
from rest_framework.decorators import permission_classes
31+
reveal_type(permission_classes) # N: Revealed type is "def (permission_classes: typing.Sequence[Union[Type[rest_framework.permissions.BasePermission], rest_framework.permissions.OperandHolder, rest_framework.permissions.SingleOperandHolder]]) -> def [_View <: def (*Any, **Any) -> django.http.response.HttpResponseBase] (_View`-1) -> _View`-1"
32+
33+
- case: permission_classes_with_operators
34+
main: |
35+
from rest_framework.permissions import BasePermission, IsAuthenticated
36+
from rest_framework.decorators import permission_classes
37+
38+
class Permission(BasePermission):
39+
pass
40+
41+
permission_classes([IsAuthenticated & Permission])
42+
permission_classes([IsAuthenticated | Permission])
43+
permission_classes([~Permission])

0 commit comments

Comments
 (0)