Skip to content

Commit

Permalink
FileLikeQueue not compatible with Python3
Browse files Browse the repository at this point in the history
Close #185
  • Loading branch information
mar10 committed Nov 13, 2021
1 parent 393ab82 commit 3ae8ef3
Show file tree
Hide file tree
Showing 5 changed files with 21 additions and 20 deletions.
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
The new option `dir_browser.davmount_links` controls link display (default: false).
- #222 Discrepancy between "getetag" property and ETag header
- TODO: Support LibreOffice in dir_browser
- TODO: #185 FileLikeQueue not compatible with Python3
- TODO: #185 FileLikeQueue USE BYTES

## 3.1.2 / Unreleased

Expand Down
2 changes: 1 addition & 1 deletion Pipfile
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ recommonmark = "*"
requests = "*"
rope = "*"
setuptools = "*"
Sphinx = "~=4.3" # "~=1.6"
Sphinx = "~=4.3"
sphinx_rtd_theme = "~=1.0"
stressor = "*"
tox = "*" # "~=3.13"
Expand Down
26 changes: 13 additions & 13 deletions tests/test_streaming.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,43 +117,43 @@ def tearDown(self):
def testFileLikeQueueUnsized(self):
# queue of unlimited size
q = FileLikeQueue()
q.write("*" * 42)
q.write("*" * 3)
q.write(b"*" * 42)
q.write(b"*" * 3)
# unsized reads will return chunks as queued
res = q.read()
self.assertEqual(len(res), 42)
res = q.read()
self.assertEqual(len(res), 3)
q.close() # subsequent reads will return "" instead of blocking
res = q.read()
self.assertEqual(res, "", "Read after close() returns ''")
self.assertEqual(res, b"", "Read after close() returns ''")
# subsequent write will raise
self.assertRaises(ValueError, q.write, "***")
self.assertRaises(ValueError, q.write, b"***")

def testFileLikeQueue(self):
# queue of unlimited size
q = FileLikeQueue()
# queue 32 bytes
q.write("*" * 7)
q.write("*" * 11)
q.write("*" * 5)
q.write("*" * 9)
q.write(b"*" * 7)
q.write(b"*" * 11)
q.write(b"*" * 5)
q.write(b"*" * 9)
q.close()
# sized reads will return chunks as demanded
for _ in range(6):
self.assertEqual(len(q.read(5)), 5)
self.assertEqual(len(q.read(5)), 2, "last chunk delivers the reminder")
self.assertEqual(len(q.read(5)), 0, "furtehr read() returns ''")
self.assertEqual(len(q.read(5)), 0, "further read() returns ''")
# self.assertEqual(q.size, 0)

def testFileLikeQueueAll(self):
# queue of unlimited size
q = FileLikeQueue()
# queue 32 bytes
q.write("*" * 7)
q.write("*" * 11)
q.write("*" * 5)
q.write("*" * 9)
q.write(b"*" * 7)
q.write(b"*" * 11)
q.write(b"*" * 5)
q.write(b"*" * 9)
q.close()
# read(-1) returns all, then ''
self.assertEqual(len(q.read(-1)), 32)
Expand Down
10 changes: 6 additions & 4 deletions wsgidav/stream_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ def begin_write(self, contentType=None):
def __init__(self, max_size=0):
self.is_closed = False
self.queue = queue.Queue(max_size)
self.unread = ""
self.unread = b""

def read(self, size=0):
"""Read a chunk of bytes from queue.
Expand All @@ -63,13 +63,13 @@ def read(self, size=0):
However, if close() was called, '' is returned immediately.
"""
res = self.unread
self.unread = ""
self.unread = b""
# Get next chunk, cumulating requested size as needed
while res == "" or size < 0 or (size > 0 and len(res) < size):
while res == b"" or size < 0 or (size > 0 and len(res) < size):
try:
# Read pending data, blocking if neccessary
# (but handle the case that close() is called while waiting)
res += util.to_str(self.queue.get(True, 0.1))
res += self.queue.get(True, 0.1)
except queue.Empty:
# There was no pending data: wait for more, unless close() was called
if self.is_closed:
Expand All @@ -79,13 +79,15 @@ def read(self, size=0):
self.unread = res[size:]
res = res[:size]
# print("FileLikeQueue.read({}) => {} bytes".format(size, len(res)))
assert type(res) is bytes
return res

def write(self, chunk):
"""Put a chunk of bytes (or an iterable) to the queue.
May block if max_size number of chunks is reached.
"""
assert type(chunk) is bytes
if self.is_closed:
raise ValueError("Cannot write to closed object")
# print("FileLikeQueue.write(), n={}".format(len(chunk)))
Expand Down
1 change: 0 additions & 1 deletion wsgidav/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -1096,7 +1096,6 @@ def get_file_etag(file_path):
return etag



# ========================================================================
# Ranges
# ========================================================================
Expand Down

0 comments on commit 3ae8ef3

Please sign in to comment.