Skip to content

Commit 4c4d88e

Browse files
joke1196claude
authored andcommitted
SONARPY-3778 Create rule S8443: Django Command classes should inherit from BaseCommand (#883)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> GitOrigin-RevId: 5c7e0b6eaf4e3a6edc9908b898f60e14f404b6ff
1 parent 3270c6c commit 4c4d88e

File tree

10 files changed

+281
-15
lines changed

10 files changed

+281
-15
lines changed

python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.core.management.base.protobuf

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
2+
django.core.management.base�
3+
BaseCommand'django.core.management.base.BaseCommand"builtins.object*�
4+
__init__0django.core.management.base.BaseCommand.__init__"
5+
None*\
6+
selfR
7+
'django.core.management.base.BaseCommand"'django.core.management.base.BaseCommand*�
8+
stdoutu
9+
#Union[typing.IO[builtins.str],None]B
10+
typing.IO[builtins.str]
11+
builtins.str" builtins.str" typing.IO
12+
None *�
13+
stderru
14+
#Union[typing.IO[builtins.str],None]B
15+
typing.IO[builtins.str]
16+
builtins.str" builtins.str" typing.IO
17+
None *.
18+
no_color
19+
builtins.bool"builtins.bool *1
20+
force_color
21+
builtins.bool"builtins.bool *�
22+
create_parser5django.core.management.base.BaseCommand.create_parser"2
23+
argparse.ArgumentParser"argparse.ArgumentParser*\
24+
selfR
25+
'django.core.management.base.BaseCommand"'django.core.management.base.BaseCommand*+
26+
prog_name
27+
builtins.str" builtins.str*T
28+
29+
subcommandD
30+
Union[builtins.str,None]
31+
builtins.str" builtins.str
32+
None*�
33+
add_arguments5django.core.management.base.BaseCommand.add_arguments"
34+
None*\
35+
selfR
36+
'django.core.management.base.BaseCommand"'django.core.management.base.BaseCommand*>
37+
parser2
38+
argparse.ArgumentParser"argparse.ArgumentParser*�
39+
handle.django.core.management.base.BaseCommand.handle"D
40+
Union[builtins.str,None]
41+
builtins.str" builtins.str
42+
None*\
43+
selfR
44+
'django.core.management.base.BaseCommand"'django.core.management.base.BaseCommand*
45+
args
46+
Any*
47+
options
48+
Any*�
49+
execute/django.core.management.base.BaseCommand.execute"D
50+
Union[builtins.str,None]
51+
builtins.str" builtins.str
52+
None*\
53+
selfR
54+
'django.core.management.base.BaseCommand"'django.core.management.base.BaseCommand*
55+
args
56+
Any*
57+
options
58+
Any*�
59+
60+
print_help2django.core.management.base.BaseCommand.print_help"
61+
None*\
62+
selfR
63+
'django.core.management.base.BaseCommand"'django.core.management.base.BaseCommand*+
64+
prog_name
65+
builtins.str" builtins.str*T
66+
67+
subcommandD
68+
Union[builtins.str,None]
69+
builtins.str" builtins.str
70+
None*�
71+
get_version3django.core.management.base.BaseCommand.get_version"
72+
builtins.str" builtins.str*\
73+
selfR
74+
'django.core.management.base.BaseCommand"'django.core.management.base.BaseCommandrR
75+
help,django.core.management.base.BaseCommand.help
76+
builtins.str" builtins.strr~
77+
_called_from_command_lineAdjango.core.management.base.BaseCommand._called_from_command_line
78+
builtins.bool"builtins.boolrp
79+
output_transaction:django.core.management.base.BaseCommand.output_transaction
80+
builtins.bool"builtins.boolr�
81+
requires_migrations_checksBdjango.core.management.base.BaseCommand.requires_migrations_checks
82+
builtins.bool"builtins.boolr�
83+
requires_system_checks>django.core.management.base.BaseCommand.requires_system_checks�
84+
1Union[builtins.str,typing.Sequence[builtins.str]]
85+
builtins.str" builtins.strN
86+
typing.Sequence[builtins.str]
87+
builtins.str" builtins.str"typing.Sequencer�
88+
base_stealth_options<django.core.management.base.BaseCommand.base_stealth_optionsL
89+
builtins.tuple[builtins.str]
90+
builtins.str" builtins.str"builtins.tupler�
91+
stealth_options7django.core.management.base.BaseCommand.stealth_optionsL
92+
builtins.tuple[builtins.str]
93+
builtins.str" builtins.str"builtins.tupler�
94+
suppressed_base_argumentsAdjango.core.management.base.BaseCommand.suppressed_base_argumentsH
95+
builtins.set[builtins.str]
96+
builtins.str" builtins.str" builtins.setr|
97+
stdout.django.core.management.base.BaseCommand.stdoutB
98+
typing.IO[builtins.str]
99+
builtins.str" builtins.str" typing.IOr|
100+
stderr.django.core.management.base.BaseCommand.stderrB
101+
typing.IO[builtins.str]
102+
builtins.str" builtins.str" typing.IO*�
103+
__annotations__+django.core.management.base.__annotations__W
104+
builtins.dict[builtins.str,Any]
105+
builtins.str" builtins.str
106+
Any"builtins.dict*I
107+
SystemCheckError,django.core.management.base.SystemCheckError
108+
Any

python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.core.management.protobuf

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
2+
django.core.management�
3+
BaseCommand'django.core.management.base.BaseCommand"builtins.object*�
4+
__init__0django.core.management.base.BaseCommand.__init__"
5+
None*\
6+
selfR
7+
'django.core.management.base.BaseCommand"'django.core.management.base.BaseCommand*�
8+
stdoutu
9+
#Union[typing.IO[builtins.str],None]B
10+
typing.IO[builtins.str]
11+
builtins.str" builtins.str" typing.IO
12+
None *�
13+
stderru
14+
#Union[typing.IO[builtins.str],None]B
15+
typing.IO[builtins.str]
16+
builtins.str" builtins.str" typing.IO
17+
None *.
18+
no_color
19+
builtins.bool"builtins.bool *1
20+
force_color
21+
builtins.bool"builtins.bool *�
22+
create_parser5django.core.management.base.BaseCommand.create_parser"2
23+
argparse.ArgumentParser"argparse.ArgumentParser*\
24+
selfR
25+
'django.core.management.base.BaseCommand"'django.core.management.base.BaseCommand*+
26+
prog_name
27+
builtins.str" builtins.str*T
28+
29+
subcommandD
30+
Union[builtins.str,None]
31+
builtins.str" builtins.str
32+
None*�
33+
add_arguments5django.core.management.base.BaseCommand.add_arguments"
34+
None*\
35+
selfR
36+
'django.core.management.base.BaseCommand"'django.core.management.base.BaseCommand*>
37+
parser2
38+
argparse.ArgumentParser"argparse.ArgumentParser*�
39+
handle.django.core.management.base.BaseCommand.handle"D
40+
Union[builtins.str,None]
41+
builtins.str" builtins.str
42+
None*\
43+
selfR
44+
'django.core.management.base.BaseCommand"'django.core.management.base.BaseCommand*
45+
args
46+
Any*
47+
options
48+
Any*�
49+
execute/django.core.management.base.BaseCommand.execute"D
50+
Union[builtins.str,None]
51+
builtins.str" builtins.str
52+
None*\
53+
selfR
54+
'django.core.management.base.BaseCommand"'django.core.management.base.BaseCommand*
55+
args
56+
Any*
57+
options
58+
Any*�
59+
60+
print_help2django.core.management.base.BaseCommand.print_help"
61+
None*\
62+
selfR
63+
'django.core.management.base.BaseCommand"'django.core.management.base.BaseCommand*+
64+
prog_name
65+
builtins.str" builtins.str*T
66+
67+
subcommandD
68+
Union[builtins.str,None]
69+
builtins.str" builtins.str
70+
None*�
71+
get_version3django.core.management.base.BaseCommand.get_version"
72+
builtins.str" builtins.str*\
73+
selfR
74+
'django.core.management.base.BaseCommand"'django.core.management.base.BaseCommandrR
75+
help,django.core.management.base.BaseCommand.help
76+
builtins.str" builtins.strr~
77+
_called_from_command_lineAdjango.core.management.base.BaseCommand._called_from_command_line
78+
builtins.bool"builtins.boolrp
79+
output_transaction:django.core.management.base.BaseCommand.output_transaction
80+
builtins.bool"builtins.boolr�
81+
requires_migrations_checksBdjango.core.management.base.BaseCommand.requires_migrations_checks
82+
builtins.bool"builtins.boolr�
83+
requires_system_checks>django.core.management.base.BaseCommand.requires_system_checks�
84+
1Union[builtins.str,typing.Sequence[builtins.str]]
85+
builtins.str" builtins.strN
86+
typing.Sequence[builtins.str]
87+
builtins.str" builtins.str"typing.Sequencer�
88+
base_stealth_options<django.core.management.base.BaseCommand.base_stealth_optionsL
89+
builtins.tuple[builtins.str]
90+
builtins.str" builtins.str"builtins.tupler�
91+
stealth_options7django.core.management.base.BaseCommand.stealth_optionsL
92+
builtins.tuple[builtins.str]
93+
builtins.str" builtins.str"builtins.tupler�
94+
suppressed_base_argumentsAdjango.core.management.base.BaseCommand.suppressed_base_argumentsH
95+
builtins.set[builtins.str]
96+
builtins.str" builtins.str" builtins.setr|
97+
stdout.django.core.management.base.BaseCommand.stdoutB
98+
typing.IO[builtins.str]
99+
builtins.str" builtins.str" typing.IOr|
100+
stderr.django.core.management.base.BaseCommand.stderrB
101+
typing.IO[builtins.str]
102+
builtins.str" builtins.str" typing.IO*w
103+
__path__django.core.management.__path__J
104+
builtins.list[builtins.str]
105+
builtins.str" builtins.str"builtins.list*�
106+
__annotations__&django.core.management.__annotations__W
107+
builtins.dict[builtins.str,Any]
108+
builtins.str" builtins.str
109+
Any"builtins.dict

python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.core.protobuf

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
2+
django.core*l
3+
__path__django.core.__path__J
4+
builtins.list[builtins.str]
5+
builtins.str" builtins.str"builtins.list*�
6+
__annotations__django.core.__annotations__W
7+
builtins.dict[builtins.str,Any]
8+
builtins.str" builtins.str
9+
Any"builtins.dict

python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.detail.protobuf

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

2-
django.views.generic.detail�
2+
django.views.generic.detail�
33
SingleObjectMixin-django.views.generic.detail.SingleObjectMixin"&django.views.generic.base.ContextMixin*�
44

55
get_object8django.views.generic.detail.SingleObjectMixin.get_object"
@@ -33,11 +33,11 @@ get_object8django.views.generic.detail.SingleObjectMixin.get_object"
3333
self^
3434
-django.views.generic.detail.SingleObjectMixin"-django.views.generic.detail.SingleObjectMixin*
3535
kwargs
36-
Anyr
37-
model3django.views.generic.detail.SingleObjectMixin.modelA
38-
Union[Type[Any],None]
39-
Type[Any]
40-
Any"type
36+
Anyr�
37+
model3django.views.generic.detail.SingleObjectMixin.model�
38+
-Union[Type[django.db.models.base.Model],None]g
39+
!Type[django.db.models.base.Model]:
40+
django.db.models.base.Model"django.db.models.base.Model"type
4141
Nonerj
4242
queryset6django.views.generic.detail.SingleObjectMixin.queryset&
4343
Union[Any,None]

python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.list.protobuf

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

2-
django.views.generic.list�
2+
django.views.generic.list�
33
MultipleObjectMixin-django.views.generic.list.MultipleObjectMixin"&django.views.generic.base.ContextMixin*�
44
get_queryset:django.views.generic.list.MultipleObjectMixin.get_queryset"
55
Any*h
@@ -78,11 +78,11 @@
7878
queryset6django.views.generic.list.MultipleObjectMixin.queryset&
7979
Union[Any,None]
8080
Any
81-
Noner
82-
model3django.views.generic.list.MultipleObjectMixin.modelA
83-
Union[Type[Any],None]
84-
Type[Any]
85-
Any"type
81+
Noner�
82+
model3django.views.generic.list.MultipleObjectMixin.model�
83+
-Union[Type[django.db.models.base.Model],None]g
84+
!Type[django.db.models.base.Model]:
85+
django.db.models.base.Model"django.db.models.base.Model"type
8686
Noner�
8787
paginate_by9django.views.generic.list.MultipleObjectMixin.paginate_byD
8888
Union[builtins.int,None]
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
ff99a5ab4ee8349e8b21eeb3668e2e4990aa198e31cc27ca31aee9299e0bed67
2-
7886ceeda4958304a326174baba1ff7ac6c0298352b3e9699aa7322185d94f69
1+
1c8010bc70819847c25235e37ca98a48d47747b77edc77887b1bdd3ee5c49521
2+
c854205ed8f8a5d5935b2164fd2f15bf962159b9a8045e243aec3c3b4e393e76

python-frontend/typeshed_serializer/resources/custom/django/core/__init__.pyi

Whitespace-only changes.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from django.core.management.base import BaseCommand as BaseCommand
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
from typing import Any, IO, Sequence, Set, Tuple
2+
import argparse
3+
from django.core.management.base import SystemCheckError
4+
5+
class BaseCommand:
6+
# Metadata about this command.
7+
help: str
8+
9+
# Configuration shortcuts that alter various logic.
10+
_called_from_command_line: bool
11+
output_transaction: bool # Whether to wrap the output in a "BEGIN; COMMIT;"
12+
requires_migrations_checks: bool
13+
requires_system_checks: str | Sequence[str]
14+
# Arguments, common to all commands, which aren't defined by the argument parser.
15+
base_stealth_options: Tuple[str, ...]
16+
# Command-specific options not defined by the argument parser.
17+
stealth_options: Tuple[str, ...]
18+
suppressed_base_arguments: Set[str]
19+
20+
stdout: IO[str]
21+
stderr: IO[str]
22+
23+
def __init__(
24+
self,
25+
stdout: IO[str] | None = None,
26+
stderr: IO[str] | None = None,
27+
no_color: bool = False,
28+
force_color: bool = False,
29+
) -> None: ...
30+
def create_parser(
31+
self,
32+
prog_name: str,
33+
subcommand: str | None,
34+
) -> argparse.ArgumentParser: ...
35+
def add_arguments(self, parser: argparse.ArgumentParser) -> None: ...
36+
def handle(self, *args: Any, **options: Any) -> str | None: ...
37+
def execute(self, *args: Any, **options: Any) -> str | None: ...
38+
def print_help(self, prog_name: str, subcommand: str | None) -> None: ...
39+
def get_version(self) -> str: ...

python-frontend/typeshed_serializer/tests/test_serializers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ def test_custom_stubs_serializer(typeshed_custom_stubs):
7474
custom_stubs_serializer.serialize()
7575
assert custom_stubs_serializer.get_build_result.call_count == 1
7676
# Not every files from "typeshed_custom_stubs" build are serialized, as some are builtins
77-
assert symbols.save_module.call_count == 336
77+
assert symbols.save_module.call_count == 339
7878

7979

8080
def test_importer_serializer():

0 commit comments

Comments
 (0)