Skip to content

Commit dc83998

Browse files
authored
Merge pull request #157 from jakkdl/105_113_typecheck
2 parents 76f5363 + bf0d45d commit dc83998

File tree

12 files changed

+126
-83
lines changed

12 files changed

+126
-83
lines changed

.pre-commit-config.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ repos:
2828
hooks:
2929
- id: isort
3030

31+
- repo: https://github.com/pre-commit/mirrors-mypy
32+
rev: v1.1.1
33+
hooks:
34+
- id: mypy
35+
3136
- repo: https://github.com/RobertCraigie/pyright-python
3237
rev: v1.1.298
3338
hooks:

flake8_trio/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ def add_options(option_manager: OptionManager | ArgumentParser):
162162
# Disable TRIO9xx calls by default
163163
option_manager.extend_default_ignore(default_disabled_error_codes)
164164
# add parameter to parse from flake8 config
165-
add_argument = functools.partial(
165+
add_argument = functools.partial( # type: ignore
166166
option_manager.add_option, parse_from_config=True
167167
)
168168
add_argument("--autofix", action="store_true", required=False)
@@ -207,7 +207,7 @@ def add_options(option_manager: OptionManager | ArgumentParser):
207207
)
208208
add_argument(
209209
"--enable-visitor-codes-regex",
210-
type=re.compile,
210+
type=re.compile, # type: ignore[arg-type]
211211
default=".*",
212212
required=False,
213213
help=(

flake8_trio/visitors/helpers.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,10 @@ def error_class_cst(error_class: type[T_CST]) -> type[T_CST]:
4444

4545

4646
def disabled_by_default(error_class: type[T_EITHER]) -> type[T_EITHER]:
47-
assert error_class.error_codes
48-
default_disabled_error_codes.extend(error_class.error_codes)
47+
assert error_class.error_codes # type: ignore[attr-defined]
48+
default_disabled_error_codes.extend(
49+
error_class.error_codes # type: ignore[attr-defined]
50+
)
4951
return error_class
5052

5153

pyproject.toml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@ quiet = true
1818
skip_gitignore = true
1919
skip_glob = "tests/eval_files/*"
2020

21+
[tool.mypy]
22+
check_untyped_defs = true
23+
disable_error_code = ["no-untyped-def", "misc", "no-untyped-call", "no-any-return"]
24+
strict = true
25+
warn_unreachable = true
26+
warn_unused_ignores = false
27+
2128
[tool.pyright]
2229
exclude = ["**/node_modules", "**/__pycache__", "**/.*"]
2330
reportCallInDefaultInitializer = true

tests/eval_files/trio103.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@ def foo() -> Any:
4848
try:
4949
...
5050
except BaseException as e: # TRIO103_trio: 7, "BaseException"
51-
if True:
51+
if ...:
5252
raise e
53-
elif True:
53+
elif ...:
5454
...
5555
else:
5656
raise e
@@ -64,9 +64,9 @@ def foo() -> Any:
6464
try:
6565
...
6666
except BaseException: # safe
67-
if True:
67+
if ...:
6868
raise
69-
elif True:
69+
elif ...:
7070
raise
7171
else:
7272
raise
@@ -121,7 +121,7 @@ def foo() -> Any:
121121
...
122122
except BaseException:
123123
raise
124-
for _ in "":
124+
for _ in "": # type: ignore[unreachable]
125125
if ...:
126126
break
127127
raise
@@ -241,7 +241,7 @@ def foo() -> Any:
241241
try:
242242
...
243243
except BaseException:
244-
for ii in {**{}, **{1: 2}}:
244+
for i in {**{}, **{1: 2}}: # type: ignore[arg-type]
245245
raise
246246

247247
try:

tests/eval_files/trio104.py

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,12 @@
8282
except BaseException:
8383
raise e # error: 8
8484

85-
# check for avoiding re-raise by returning from function
8685
def foo():
8786
if True: # for code coverage
8887
return
8988

89+
# check for avoiding re-raise by returning from function
90+
def foo2():
9091
try:
9192
...
9293
except BaseException: # TRIO103_trio: 11, "BaseException"
@@ -101,27 +102,29 @@ def foo():
101102
except ValueError:
102103
return # error: 12
103104
else:
104-
return # error: 12
105+
return # type: ignore[unreachable] # error: 12
105106
finally:
106107
return # error: 12
107108

108109

109110
# don't avoid re-raise with continue/break
110-
while True:
111-
try:
112-
...
113-
except BaseException:
114-
if True:
115-
continue # error: 12
116-
raise
111+
def foo3():
112+
while True:
113+
try:
114+
...
115+
except BaseException:
116+
if True:
117+
continue # error: 16
118+
raise
117119

118-
while True:
119-
try:
120-
...
121-
except BaseException:
122-
if True:
123-
break # error: 12
124-
raise
120+
def foo4():
121+
while True:
122+
try:
123+
...
124+
except BaseException:
125+
if True:
126+
break # error: 16
127+
raise
125128

126129
try:
127130
...

tests/eval_files/trio105.py

Lines changed: 68 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,35 @@
11
# NOANYIO
22
from typing import Any
3+
from collections.abc import Coroutine
34

45
import trio
56

67
par: Any = ...
8+
async_funpar: Coroutine[Any, Any, Any] = ... # type: ignore
79

810

9-
async def foo():
11+
async def myasyncfun(task_status):
12+
...
13+
14+
15+
# calls that don't return
16+
async def inf1() -> None:
17+
await trio.serve_listeners(par, par)
18+
19+
20+
async def inf2() -> None:
21+
await trio.serve_ssl_over_tcp()
22+
23+
24+
async def inf3() -> None:
25+
await trio.serve_tcp()
26+
27+
28+
async def inf4() -> None:
29+
await trio.sleep_forever()
30+
31+
32+
async def foo() -> None:
1033
# not async
1134
trio.run(par)
1235

@@ -19,75 +42,72 @@ async def foo():
1942
await trio.open_tcp_stream(par, par)
2043
await trio.open_unix_socket(par)
2144
await trio.run_process(par)
22-
await trio.serve_listeners(par, par)
23-
await trio.serve_ssl_over_tcp()
24-
await trio.serve_tcp()
25-
await trio.sleep()
26-
await trio.sleep_forever()
27-
await trio.sleep_until()
45+
await trio.sleep(5)
46+
await trio.sleep_until(5)
2847
await trio.lowlevel.cancel_shielded_checkpoint()
2948
await trio.lowlevel.checkpoint()
3049
await trio.lowlevel.checkpoint_if_cancelled()
31-
await trio.lowlevel.open_process()
32-
await trio.lowlevel.permanently_detach_coroutine_object()
33-
await trio.lowlevel.reattach_detached_coroutine_object()
34-
await trio.lowlevel.temporarily_detach_coroutine_object()
35-
await trio.lowlevel.wait_readable()
36-
await trio.lowlevel.wait_task_rescheduled()
37-
await trio.lowlevel.wait_writable()
50+
await trio.lowlevel.open_process(par)
51+
await trio.lowlevel.permanently_detach_coroutine_object(par)
52+
await trio.lowlevel.reattach_detached_coroutine_object(par, par)
53+
await trio.lowlevel.temporarily_detach_coroutine_object(par)
54+
await trio.lowlevel.wait_readable(par)
55+
await trio.lowlevel.wait_task_rescheduled(par)
56+
await trio.lowlevel.wait_writable(par)
3857

3958
# all async functions
40-
trio.aclose_forcefully() # error: 4, "trio.aclose_forcefully", "function"
41-
trio.open_file() # error: 4, "trio.open_file", "function"
42-
trio.open_ssl_over_tcp_listeners() # error: 4, "trio.open_ssl_over_tcp_listeners", "function"
43-
trio.open_ssl_over_tcp_stream() # error: 4, "trio.open_ssl_over_tcp_stream", "function"
44-
trio.open_tcp_listeners() # error: 4, "trio.open_tcp_listeners", "function"
45-
trio.open_tcp_stream() # error: 4, "trio.open_tcp_stream", "function"
46-
trio.open_unix_socket() # error: 4, "trio.open_unix_socket", "function"
47-
trio.run_process() # error: 4, "trio.run_process", "function"
48-
trio.serve_listeners() # error: 4, "trio.serve_listeners", "function"
49-
trio.serve_ssl_over_tcp() # error: 4, "trio.serve_ssl_over_tcp", "function"
50-
trio.serve_tcp() # error: 4, "trio.serve_tcp", "function"
51-
trio.sleep() # error: 4, "trio.sleep", "function"
59+
# fmt: off
60+
trio.aclose_forcefully(par) # error: 4, "trio.aclose_forcefully", "function"
61+
trio.open_file(par) # error: 4, "trio.open_file", "function"
62+
trio.open_ssl_over_tcp_listeners(par, par) # error: 4, "trio.open_ssl_over_tcp_listeners", "function"
63+
trio.open_ssl_over_tcp_stream(par, par) # error: 4, "trio.open_ssl_over_tcp_stream", "function"
64+
trio.open_tcp_listeners(par) # error: 4, "trio.open_tcp_listeners", "function"
65+
trio.open_tcp_stream(par, par) # error: 4, "trio.open_tcp_stream", "function"
66+
trio.open_unix_socket(par) # error: 4, "trio.open_unix_socket", "function"
67+
trio.run_process(par) # error: 4, "trio.run_process", "function"
68+
trio.serve_listeners(par, par) # error: 4, "trio.serve_listeners", "function"
69+
trio.serve_ssl_over_tcp(par, par, par) # error: 4, "trio.serve_ssl_over_tcp", "function"
70+
trio.serve_tcp(par, par) # error: 4, "trio.serve_tcp", "function"
71+
trio.sleep(par) # error: 4, "trio.sleep", "function"
5272
trio.sleep_forever() # error: 4, "trio.sleep_forever", "function"
53-
trio.sleep_until() # error: 4, "trio.sleep_until", "function"
73+
trio.sleep_until(par) # error: 4, "trio.sleep_until", "function"
5474

5575
# long lines, wheee
5676
trio.lowlevel.cancel_shielded_checkpoint() # error: 4, "trio.lowlevel.cancel_shielded_checkpoint", "function"
5777
trio.lowlevel.checkpoint() # error: 4, "trio.lowlevel.checkpoint", "function"
5878
trio.lowlevel.checkpoint_if_cancelled() # error: 4, "trio.lowlevel.checkpoint_if_cancelled", "function"
5979
trio.lowlevel.open_process() # error: 4, "trio.lowlevel.open_process", "function"
60-
trio.lowlevel.permanently_detach_coroutine_object() # error: 4, "trio.lowlevel.permanently_detach_coroutine_object", "function"
61-
trio.lowlevel.reattach_detached_coroutine_object() # error: 4, "trio.lowlevel.reattach_detached_coroutine_object", "function"
62-
trio.lowlevel.temporarily_detach_coroutine_object() # error: 4, "trio.lowlevel.temporarily_detach_coroutine_object", "function"
63-
trio.lowlevel.wait_readable() # error: 4, "trio.lowlevel.wait_readable", "function"
64-
trio.lowlevel.wait_task_rescheduled() # error: 4, "trio.lowlevel.wait_task_rescheduled", "function"
65-
trio.lowlevel.wait_writable() # error: 4, "trio.lowlevel.wait_writable", "function"
66-
80+
trio.lowlevel.permanently_detach_coroutine_object(par) # error: 4, "trio.lowlevel.permanently_detach_coroutine_object", "function"
81+
trio.lowlevel.reattach_detached_coroutine_object(par, par) # error: 4, "trio.lowlevel.reattach_detached_coroutine_object", "function"
82+
trio.lowlevel.temporarily_detach_coroutine_object(par) # error: 4, "trio.lowlevel.temporarily_detach_coroutine_object", "function"
83+
trio.lowlevel.wait_readable(par) # error: 4, "trio.lowlevel.wait_readable", "function"
84+
trio.lowlevel.wait_task_rescheduled(par) # error: 4, "trio.lowlevel.wait_task_rescheduled", "function"
85+
trio.lowlevel.wait_writable(par) # error: 4, "trio.lowlevel.wait_writable", "function"
86+
# fmt: on
6787
# safe
68-
async with await trio.open_file() as f:
88+
async with await trio.open_file(par) as f:
6989
pass
7090

71-
async with trio.open_file() as f: # error: 15, "trio.open_file", "function"
91+
async with trio.open_file(par) as f: # error: 15, "trio.open_file", "function"
7292
pass
7393

7494
# safe in theory, but deemed sufficiently poor style that parsing
7595
# it isn't supported
76-
k = trio.open_file() # error: 8, "trio.open_file", "function"
96+
k = trio.open_file(par) # error: 8, "trio.open_file", "function"
7797
await k
7898

7999
# issue #56
80-
nursery = trio.open_nursery()
81-
await nursery.start()
82-
await nursery.start_foo()
100+
async with trio.open_nursery() as nursery:
101+
await nursery.start(myasyncfun)
102+
await nursery.start_foo()
83103

84-
nursery.start() # error: 4, "trio.Nursery.start", "method"
85-
None.start() # type: ignore
86-
nursery.start_soon()
87-
nursery.start_foo()
104+
nursery.start(myasyncfun) # error: 8, "trio.Nursery.start", "method"
105+
None.start() # type: ignore
106+
nursery.start_soon(par)
107+
nursery.start_foo()
88108

89-
with trio.open_nursery() as booboo:
90-
booboo.start() # error: 8, "trio.Nursery.start", "method"
109+
async with trio.open_nursery() as booboo:
110+
booboo.start(myasyncfun) # error: 12, "trio.Nursery.start", "method"
91111

92-
barbar: trio.Nursery = ...
93-
barbar.start() # error: 4, "trio.Nursery.start", "method"
112+
barbar: trio.Nursery = ...
113+
barbar.start(myasyncfun) # error: 8, "trio.Nursery.start", "method"

tests/eval_files/trio910.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# mypy: disable-error-code="unreachable"
12
import typing
23
from typing import Any, overload
34

tests/eval_files/trio911.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -731,7 +731,7 @@ async def foo_loop_static():
731731
await foo()
732732
yield
733733

734-
for _ in {**{}, **{1: 2}}:
734+
for _ in {**{}, **{1: 2}}: # type: ignore[arg-type]
735735
await foo()
736736
yield
737737

@@ -795,7 +795,7 @@ async def foo_loop_static():
795795
yield
796796

797797
while False:
798-
await foo()
798+
await foo() # type: ignore[unreachable]
799799
yield # error: 4, "yield", Stmt("yield", line-4)
800800

801801
while "hello":

tests/test_changelog_and_version.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,7 @@ def runTest(self):
9595
# but afaict it should be something like str|Tuple[str,...]
9696
# depending on whether there's a group in the pattern or not.
9797
# (or bytes, if both inputs are bytes)
98-
assert isinstance(m, str)
99-
documented_errors["eval_files"].add(m)
98+
documented_errors["eval_files"].add(m) # type: ignore
10099
break
101100

102101
for errset in documented_errors.values():

0 commit comments

Comments
 (0)