Skip to content

Commit e3253e1

Browse files
authored
mypy --strict now reports less than 100 errors (#1553)
1 parent b558b06 commit e3253e1

File tree

12 files changed

+128
-118
lines changed

12 files changed

+128
-118
lines changed

av/error.pyi

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ def make_error(
1111
filename: str | None = None,
1212
log: tuple[int, tuple[int, str, str] | None] | None = None,
1313
) -> None: ...
14+
def err_check(res: int, filename: str | None = None) -> int: ...
15+
16+
BUFFER_TOO_SMALL: EnumItem
1417

1518
class ErrorType(EnumItem):
1619
BSF_NOT_FOUND: int

av/frame.pyi

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
from fractions import Fraction
2+
from typing import TypedDict
3+
4+
from av.sidedata.motionvectors import MotionVectors
5+
6+
class SideData(TypedDict, total=False):
7+
MOTION_VECTORS: MotionVectors
28

39
class Frame:
410
dts: int | None
511
pts: int | None
612
time: float | None
713
time_base: Fraction
814
is_corrupt: bool
9-
side_data: dict[str, str]
15+
side_data: SideData
1016
opaque: object
1117

1218
def make_writable(self) -> None: ...

av/video/frame.pyi

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ class VideoFrame(Frame):
4646
width: int | None = None,
4747
height: int | None = None,
4848
format: str | None = None,
49-
src_colorspace: int | None = None,
50-
dst_colorspace: int | None = None,
49+
src_colorspace: str | int | None = None,
50+
dst_colorspace: str | int | None = None,
5151
interpolation: int | str | None = None,
5252
src_color_range: int | str | None = None,
5353
dst_color_range: int | str | None = None,

tests/test_codec_context.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ def test_bits_per_coded_sample(self):
169169
stream.bits_per_coded_sample = 31
170170

171171
with pytest.raises(av.error.InvalidDataError):
172-
for frame in container.decode(stream):
172+
for _ in container.decode(stream):
173173
pass
174174

175175
with av.open(self.sandboxed("output.mov"), "w") as output:
@@ -396,7 +396,7 @@ def video_encoding(
396396
assert i == gop_size
397397

398398
final_gop_size = decoded_frame_count - max(keyframe_indices)
399-
self.assertLessEqual(final_gop_size, gop_size)
399+
assert final_gop_size < gop_size
400400

401401
def test_encoding_pcm_s24le(self) -> None:
402402
self.audio_encoding("pcm_s24le")

tests/test_decode.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def test_decode_audio_sample_count(self) -> None:
4141
audio_stream = next(s for s in container.streams if s.type == "audio")
4242

4343
assert audio_stream is container.streams.audio[0]
44-
assert isinstance(audio_stream, av.audio.AudioStream)
44+
assert isinstance(audio_stream, av.AudioStream)
4545

4646
sample_count = 0
4747

tests/test_encode.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import io
22
import math
33
from fractions import Fraction
4-
from unittest import SkipTest
54

65
import numpy as np
6+
import pytest
77

88
import av
99
from av import AudioFrame, VideoFrame
@@ -19,7 +19,7 @@
1919

2020
def write_rgb_rotate(output: av.container.OutputContainer) -> None:
2121
if not has_pillow:
22-
raise SkipTest("Don't have Pillow")
22+
pytest.skip()
2323

2424
import PIL.Image as Image
2525

@@ -233,8 +233,8 @@ def test_stream_index(self) -> None:
233233

234234
astream = output.add_stream("mp2", 48000)
235235
assert astream in output.streams.audio
236-
astream.layout = "stereo" # type: ignore
237-
astream.format = "s16" # type: ignore
236+
astream.layout = "stereo"
237+
astream.format = "s16"
238238

239239
assert vstream.index == 0
240240
assert astream.index == 1
@@ -385,4 +385,4 @@ def test_max_b_frames(self) -> None:
385385
for max_b_frames in range(4):
386386
file = encode_file_with_max_b_frames(max_b_frames)
387387
actual_max_b_frames = max_b_frame_run_in_file(file)
388-
self.assertTrue(actual_max_b_frames <= max_b_frames)
388+
assert actual_max_b_frames <= max_b_frames

tests/test_errors.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,11 @@ def test_filenotfound():
5353
assert False, "No exception raised!"
5454

5555

56-
def test_buffertoosmall():
56+
def test_buffertoosmall() -> None:
5757
"""Throw an exception from an enum."""
5858
try:
5959
av.error.err_check(-av.error.BUFFER_TOO_SMALL.value)
60-
except av.BufferTooSmallError as e:
60+
except av.error.BufferTooSmallError as e:
6161
assert e.errno == av.error.BUFFER_TOO_SMALL.value
6262
else:
6363
assert False, "No exception raised!"

tests/test_file_probing.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class TestAudioProbe(TestCase):
99
def setUp(self):
1010
self.file = av.open(fate_suite("aac/latm_stereo_to_51.ts"))
1111

12-
def test_container_probing(self):
12+
def test_container_probing(self) -> None:
1313
assert self.file.bit_rate == 269558
1414
assert self.file.duration == 6165333
1515
assert str(self.file.format) == "<av.ContainerFormat 'mpegts'>"
@@ -20,9 +20,10 @@ def test_container_probing(self):
2020
assert self.file.start_time == 1400000
2121
assert len(self.file.streams) == 1
2222

23-
def test_stream_probing(self):
23+
def test_stream_probing(self) -> None:
2424
stream = self.file.streams[0]
2525

26+
assert isinstance(stream, av.AudioStream)
2627
assert str(stream).startswith(
2728
"<av.AudioStream #0 aac_latm at 48000Hz, stereo, fltp at "
2829
)
@@ -52,7 +53,7 @@ def test_stream_probing(self):
5253

5354

5455
class TestAudioProbeCorrupt(TestCase):
55-
def setUp(self):
56+
def setUp(self) -> None:
5657
# write an empty file
5758
path = self.sandboxed("empty.flac")
5859
with open(path, "wb"):

tests/test_filters.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ def test_audio_buffer_sink(self):
126126
if e.errno != errno.EAGAIN:
127127
raise
128128

129-
def test_audio_buffer_resample(self):
129+
def test_audio_buffer_resample(self) -> None:
130130
graph = Graph()
131131
graph.link_nodes(
132132
graph.add_abuffer(
@@ -147,6 +147,7 @@ def test_audio_buffer_resample(self):
147147
)
148148
)
149149
out_frame = graph.pull()
150+
assert isinstance(out_frame, av.AudioFrame)
150151
assert out_frame.format.name == "s16"
151152
assert out_frame.layout.name == "stereo"
152153
assert out_frame.sample_rate == 44100
@@ -202,9 +203,7 @@ def test_audio_buffer_volume_filter(self):
202203
input_data = input_frame.to_ndarray()
203204
output_data = out_frame.to_ndarray()
204205

205-
self.assertTrue(
206-
np.allclose(input_data * 0.5, output_data), "Check that volume is reduced"
207-
)
206+
assert np.allclose(input_data * 0.5, output_data)
208207

209208
def test_video_buffer(self):
210209
input_container = av.open(format="lavfi", file="color=c=pink:duration=1:r=30")

tests/test_logging.py

Lines changed: 73 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -5,80 +5,81 @@
55
import av.error
66
import av.logging
77

8-
from .common import TestCase
9-
108

119
def do_log(message: str) -> None:
1210
av.logging.log(av.logging.INFO, "test", message)
1311

1412

15-
class TestLogging(TestCase):
16-
def test_adapt_level(self):
17-
assert av.logging.adapt_level(av.logging.ERROR) == logging.ERROR
18-
assert av.logging.adapt_level(av.logging.WARNING) == logging.WARNING
19-
assert (
20-
av.logging.adapt_level((av.logging.WARNING + av.logging.ERROR) // 2)
21-
== logging.WARNING
22-
)
23-
24-
def test_threaded_captures(self):
25-
av.logging.set_level(av.logging.VERBOSE)
26-
27-
with av.logging.Capture(local=True) as logs:
28-
do_log("main")
29-
thread = threading.Thread(target=do_log, args=("thread",))
30-
thread.start()
31-
thread.join()
32-
33-
assert (av.logging.INFO, "test", "main") in logs
34-
av.logging.set_level(None)
35-
36-
def test_global_captures(self):
37-
av.logging.set_level(av.logging.VERBOSE)
38-
39-
with av.logging.Capture(local=False) as logs:
40-
do_log("main")
41-
thread = threading.Thread(target=do_log, args=("thread",))
42-
thread.start()
43-
thread.join()
44-
45-
assert (av.logging.INFO, "test", "main") in logs
46-
assert (av.logging.INFO, "test", "thread") in logs
47-
av.logging.set_level(None)
48-
49-
def test_repeats(self):
50-
av.logging.set_level(av.logging.VERBOSE)
51-
52-
with av.logging.Capture() as logs:
53-
do_log("foo")
54-
do_log("foo")
55-
do_log("bar")
56-
do_log("bar")
57-
do_log("bar")
58-
do_log("baz")
59-
60-
logs = [log for log in logs if log[1] == "test"]
61-
62-
assert logs == [
63-
(av.logging.INFO, "test", "foo"),
64-
(av.logging.INFO, "test", "foo"),
65-
(av.logging.INFO, "test", "bar"),
66-
(av.logging.INFO, "test", "bar (repeated 2 more times)"),
67-
(av.logging.INFO, "test", "baz"),
68-
]
69-
70-
av.logging.set_level(None)
71-
72-
def test_error(self):
73-
av.logging.set_level(av.logging.VERBOSE)
74-
75-
log = (av.logging.ERROR, "test", "This is a test.")
76-
av.logging.log(*log)
77-
try:
78-
av.error.err_check(-errno.EPERM)
79-
except OSError as e:
80-
assert e.log == log
81-
else:
82-
self.fail()
83-
84-
av.logging.set_level(None)
13+
def test_adapt_level() -> None:
14+
assert av.logging.adapt_level(av.logging.ERROR) == logging.ERROR
15+
assert av.logging.adapt_level(av.logging.WARNING) == logging.WARNING
16+
assert (
17+
av.logging.adapt_level((av.logging.WARNING + av.logging.ERROR) // 2)
18+
== logging.WARNING
19+
)
20+
21+
22+
def test_threaded_captures() -> None:
23+
av.logging.set_level(av.logging.VERBOSE)
24+
25+
with av.logging.Capture(local=True) as logs:
26+
do_log("main")
27+
thread = threading.Thread(target=do_log, args=("thread",))
28+
thread.start()
29+
thread.join()
30+
31+
assert (av.logging.INFO, "test", "main") in logs
32+
av.logging.set_level(None)
33+
34+
35+
def test_global_captures() -> None:
36+
av.logging.set_level(av.logging.VERBOSE)
37+
38+
with av.logging.Capture(local=False) as logs:
39+
do_log("main")
40+
thread = threading.Thread(target=do_log, args=("thread",))
41+
thread.start()
42+
thread.join()
43+
44+
assert (av.logging.INFO, "test", "main") in logs
45+
assert (av.logging.INFO, "test", "thread") in logs
46+
av.logging.set_level(None)
47+
48+
49+
def test_repeats() -> None:
50+
av.logging.set_level(av.logging.VERBOSE)
51+
52+
with av.logging.Capture() as logs:
53+
do_log("foo")
54+
do_log("foo")
55+
do_log("bar")
56+
do_log("bar")
57+
do_log("bar")
58+
do_log("baz")
59+
60+
logs = [log for log in logs if log[1] == "test"]
61+
62+
assert logs == [
63+
(av.logging.INFO, "test", "foo"),
64+
(av.logging.INFO, "test", "foo"),
65+
(av.logging.INFO, "test", "bar"),
66+
(av.logging.INFO, "test", "bar (repeated 2 more times)"),
67+
(av.logging.INFO, "test", "baz"),
68+
]
69+
70+
av.logging.set_level(None)
71+
72+
73+
def test_error() -> None:
74+
av.logging.set_level(av.logging.VERBOSE)
75+
76+
log = (av.logging.ERROR, "test", "This is a test.")
77+
av.logging.log(*log)
78+
try:
79+
av.error.err_check(-errno.EPERM)
80+
except av.error.PermissionError as e:
81+
assert e.log == log
82+
else:
83+
assert False
84+
85+
av.logging.set_level(None)

0 commit comments

Comments
 (0)