8000 fix Exception ignored in: <b2sdk._internal.stream.progress.ReadingStr… · Backblaze/b2-sdk-python@cad8b2b · GitHub 8000
[go: up one dir, main page]

Skip to content

Commit cad8b2b

Browse files
fix Exception ignored in: <b2sdk._internal.stream.progress.ReadingStreamWithProgress object at 0xXXX> under python 3.13
1 parent a4a67b1 commit cad8b2b

File tree

3 files changed

+66
-0
lines changed

3 files changed

+66
-0
lines changed

b2sdk/_internal/stream/wrapper.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ def flush(self):
5454
"""
5555
self.stream.flush()
5656

57+
@property
58+
def closed(self):
59+
return self.stream.closed
60+
5761
def readable(self):
5862
return self.stream.readable()
5963

test/unit/stream/__init__.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
######################################################################
2+
#
3+
# File: test/unit/stream/__init__.py
4+
#
5+
# Copyright 2024 Backblaze Inc. All Rights Reserved.
6+
#
7+
# License https://www.backblaze.com/using_b2_code.html
8+
#
9+
######################################################################

test/unit/stream/test_progress.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
######################################################################
2+
#
3+
# File: test/unit/stream/test_progress.py
4+
#
5+
# Copyright 2024 Backblaze Inc. All Rights Reserved.
6+
#
7+
# License https://www.backblaze.com/using_b2_code.html
8+
#
9+
######################################################################
10+
import io
11+
from unittest.mock import Mock
12+
13+
from apiver_deps import ReadingStreamWithProgress
14+
15+
16+
def test_reading_stream_with_progress(tmp_path):
17+
stream = io.BytesIO(b"1234567890")
18+
progress_listener = Mock()
19+
with ReadingStreamWithProgress(stream, progress_listener=progress_listener) as wrapped_stream:
20+
assert wrapped_stream.read(1) == b"1"
21+
assert wrapped_stream.read(2) == b"23"
22+
assert wrapped_stream.read(3) == b"456"
23+
24+
assert progress_listener.bytes_completed.call_count == 3
25+
assert wrapped_stream.bytes_completed == 6
26+
27+
assert not stream.closed
28+
29+
30+
def test_reading_stream_with_progress__not_closing_wrapped_stream(tmp_path):
31+
stream = io.BytesIO(b"1234567890")
32+
progress_listener = Mock()
33+
with ReadingStreamWithProgress(stream, progress_listener=progress_listener) as wrapped_stream:
34+
assert wrapped_stream.read()
35+
36+
assert not stream.closed
37+
38+
39+
def test_reading_stream_with_progress__closed_proxy(tmp_path):
40+
"""
41+
Test that the wrapped stream is closed when the original stream is closed.
42+
43+
This is important for Python 3.13+ to prevent:
44+
'Exception ignored in: <b2sdk._internal.stream.progress.ReadingStreamWithProgress object at 0x748cf40d5180>'
45+
messages.
46+
"""
47+
stream = io.BytesIO(b"1234567890")
48+
progress_listener = Mock()
49+
wrapped_stream = ReadingStreamWithProgress(stream, progress_listener=progress_listener)
50+
51+
assert not stream.closed
52+
stream.close()
53+
assert wrapped_stream.closed

0 commit comments

Comments
 (0)
0