python-filewrap 0.2.9.1__tar.gz → 0.3.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-filewrap
3
- Version: 0.2.9.1
3
+ Version: 0.3.0.1
4
4
  Summary: Python file wrappers.
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -2,18 +2,19 @@
2
2
  # encoding: utf-8
3
3
 
4
4
  __author__ = "ChenyangGao <https://chenyanggao.github.io>"
5
- __version__ = (0, 2, 9)
5
+ __version__ = (0, 3, 0)
6
6
  __all__ = [
7
7
  "SupportsRead", "SupportsReadinto", "SupportsWrite", "SupportsSeek",
8
- "AsyncBufferedReader", "AsyncTextIOWrapper", "buffer_length",
9
- "bio_chunk_iter", "bio_chunk_async_iter", "bio_skip_iter", "bio_skip_async_iter",
10
- "bytes_iter", "bytes_async_iter", "bytes_iter_skip", "bytes_async_iter_skip",
11
- "bytes_iter_to_reader", "bytes_iter_to_async_reader", "bytes_to_chunk_iter",
12
- "bytes_to_chunk_async_iter", "bytes_ensure_part_iter", "bytes_ensure_part_async_iter",
13
- "progress_bytes_iter", "progress_bytes_async_iter", "copyfileobj", "copyfileobj_async",
14
- "bound_bytes_reader", "bound_async_bytes_reader",
8
+ "AsyncBufferedReader", "AsyncTextIOWrapper", "buffer_length", "to_string_buffer",
9
+ "to_bytes_buffer", "bio_chunk_iter", "bio_chunk_async_iter", "bio_skip_iter",
10
+ "bio_skip_async_iter", "bytes_iter", "bytes_async_iter", "bytes_iter_skip",
11
+ "bytes_async_iter_skip", "bytes_iter_to_reader", "bytes_iter_to_async_reader",
12
+ "bytes_to_chunk_iter", "bytes_to_chunk_async_iter", "bytes_ensure_part_iter",
13
+ "bytes_ensure_part_async_iter", "progress_bytes_iter", "progress_bytes_async_iter",
14
+ "copyfileobj", "copyfileobj_async", "bound_bytes_reader", "bound_async_bytes_reader",
15
15
  ]
16
16
 
17
+ from array import array
17
18
  from asyncio import Lock as AsyncLock
18
19
  from codecs import getdecoder, getencoder
19
20
  from collections.abc import (
@@ -262,7 +263,7 @@ class AsyncBufferedReader(BufferedReader):
262
263
  length = buffer_length(data)
263
264
  self._pos += buffer_length(prev_data) + length
264
265
  if BUFSIZE <= length:
265
- buf_view[:] = memoryview(data)[-BUFSIZE:]
266
+ buf_view[:] = memoryview(data).cast("B")[-BUFSIZE:]
266
267
  self._buf_pos = self._buf_stop = BUFSIZE
267
268
  else:
268
269
  buf_pos_stop = buf_stop + length
@@ -307,7 +308,7 @@ class AsyncBufferedReader(BufferedReader):
307
308
  else:
308
309
  return 0
309
310
  BUFSIZE = buffer_length(buf_view)
310
- buffer_view = memoryview(buffer)
311
+ buffer_view = memoryview(buffer).cast("B")
311
312
  buffer_view[:buf_size] = buf_view[buf_pos:buf_stop]
312
313
  buf_pos = self._buf_pos = buf_stop
313
314
  self._pos += buf_size
@@ -379,7 +380,7 @@ class AsyncBufferedReader(BufferedReader):
379
380
  else:
380
381
  return 0
381
382
  BUFSIZE = buffer_length(buf_view)
382
- buffer_view = memoryview(buffer)
383
+ buffer_view = memoryview(buffer).cast("B")
383
384
  buffer_view[:buf_size] = buf_view[buf_pos:buf_stop]
384
385
  buf_pos = self._buf_pos = buf_stop
385
386
  self._pos += buf_size
@@ -470,7 +471,7 @@ class AsyncBufferedReader(BufferedReader):
470
471
  prev_data = buf_view[buf_pos:buf_stop].tobytes()
471
472
  self._pos += buffer_length(prev_data) + length
472
473
  if BUFSIZE <= length:
473
- buf_view[:] = memoryview(data)[-BUFSIZE:]
474
+ buf_view[:] = memoryview(data).cast("B")[-BUFSIZE:]
474
475
  self._buf_pos = self._buf_stop = BUFSIZE
475
476
  else:
476
477
  buf_pos_stop = buf_stop + length
@@ -656,7 +657,7 @@ class AsyncTextIOWrapper(TextIOWrapper):
656
657
  size -= len(text)
657
658
  return n
658
659
 
659
- cache: bytes | memoryview = memoryview(data)
660
+ cache: bytes | memoryview = memoryview(data).cast("B")
660
661
  while size and buffer_length(data) == size:
661
662
  while cache:
662
663
  try:
@@ -826,9 +827,24 @@ def get_bom(encoding: str, /) -> bytes:
826
827
 
827
828
 
828
829
  def buffer_length(b: Buffer, /) -> int:
829
- if isinstance(b, (bytes, bytearray, memoryview)):
830
+ if isinstance(b, (bytes, bytearray)):
830
831
  return len(b)
831
- return len(memoryview(b))
832
+ return memoryview(b).nbytes
833
+
834
+
835
+ def to_string_buffer(s: str, /) -> array:
836
+ return array("w", s)
837
+
838
+
839
+ def to_bytes_buffer(b: Buffer, /) -> bytes | bytearray | memoryview:
840
+ if isinstance(b, (bytes, bytearray)):
841
+ return b
842
+ view = memoryview(b)
843
+ if view.format == "B":
844
+ return view
845
+ if view.c_contiguous:
846
+ return view.cast("B")
847
+ return view.tobytes()
832
848
 
833
849
 
834
850
  def bio_chunk_iter(
@@ -1140,7 +1156,7 @@ def bytes_iter(
1140
1156
  else:
1141
1157
  break
1142
1158
  else:
1143
- yield memoryview(b)[:size]
1159
+ yield memoryview(b).cast("B")[:size]
1144
1160
  if callback is not None:
1145
1161
  callback(size)
1146
1162
  break
@@ -1172,7 +1188,7 @@ async def bytes_async_iter(
1172
1188
  else:
1173
1189
  break
1174
1190
  else:
1175
- yield memoryview(b)[:size]
1191
+ yield memoryview(b).cast("B")[:size]
1176
1192
  if callback is not None:
1177
1193
  await callback(size)
1178
1194
  break
@@ -1189,8 +1205,8 @@ def bytes_iter_skip(
1189
1205
  return it
1190
1206
  if not callable(callback):
1191
1207
  callback = None
1192
- m: memoryview
1193
- for m in map(memoryview, it): # type: ignore
1208
+ for b in it:
1209
+ m = memoryview(b).cast("B")
1194
1210
  l = buffer_length(m)
1195
1211
  if callback:
1196
1212
  callback(min(l, size))
@@ -1215,7 +1231,7 @@ async def bytes_async_iter_skip(
1215
1231
  return it
1216
1232
  callback = ensure_async(callback) if callable(callback) else None
1217
1233
  async for b in it:
1218
- m = memoryview(b)
1234
+ m = memoryview(b).cast("B")
1219
1235
  l = buffer_length(m)
1220
1236
  if callback:
1221
1237
  await callback(min(l, size))
@@ -1291,8 +1307,9 @@ def bytes_iter_to_reader(
1291
1307
  del unconsumed[:]
1292
1308
  try:
1293
1309
  while True:
1294
- if b := memoryview(getnext()):
1295
- m = n + len(b)
1310
+ b = memoryview(getnext()).cast("B")
1311
+ if b_len := b.nbytes:
1312
+ m = n + b_len
1296
1313
  if m >= bufsize:
1297
1314
  delta = bufsize - n
1298
1315
  buf[n:] = b[:delta]
@@ -1301,7 +1318,7 @@ def bytes_iter_to_reader(
1301
1318
  return bufsize
1302
1319
  else:
1303
1320
  buf[n:m] = b
1304
- pos += len(b)
1321
+ pos += b_len
1305
1322
  n = m
1306
1323
  except StopIteration:
1307
1324
  at_end = True
@@ -1460,8 +1477,9 @@ def bytes_iter_to_async_reader(
1460
1477
  del unconsumed[:]
1461
1478
  try:
1462
1479
  while True:
1463
- if b := memoryview(await getnext()):
1464
- m = n + len(b)
1480
+ b = memoryview(await getnext()).cast("B")
1481
+ if b_len := b.nbytes:
1482
+ m = n + b_len
1465
1483
  if m >= bufsize:
1466
1484
  delta = bufsize - n
1467
1485
  buf[n:] = b[:delta]
@@ -1470,7 +1488,7 @@ def bytes_iter_to_async_reader(
1470
1488
  return bufsize
1471
1489
  else:
1472
1490
  buf[n:m] = b
1473
- pos += len(b)
1491
+ pos += b_len
1474
1492
  n = m
1475
1493
  except (StopIteration, StopAsyncIteration):
1476
1494
  at_end = True
@@ -1566,7 +1584,7 @@ def bytes_to_chunk_iter(
1566
1584
  /,
1567
1585
  chunksize: int = READ_BUFSIZE,
1568
1586
  ) -> Iterator[memoryview]:
1569
- m = memoryview(b)
1587
+ m = memoryview(b).cast("B")
1570
1588
  for i in range(0, buffer_length(m), chunksize):
1571
1589
  yield m[i:i+chunksize]
1572
1590
 
@@ -1576,7 +1594,7 @@ async def bytes_to_chunk_async_iter(
1576
1594
  /,
1577
1595
  chunksize: int = READ_BUFSIZE,
1578
1596
  ) -> AsyncIterator[memoryview]:
1579
- m = memoryview(b)
1597
+ m = memoryview(b).cast("B")
1580
1598
  for i in range(0, buffer_length(m), chunksize):
1581
1599
  yield m[i:i+chunksize]
1582
1600
 
@@ -1588,7 +1606,7 @@ def bytes_ensure_part_iter(
1588
1606
  ) -> Iterator[Buffer]:
1589
1607
  n = partsize
1590
1608
  for b in it:
1591
- m = memoryview(b)
1609
+ m = memoryview(b).cast("B")
1592
1610
  l = buffer_length(m)
1593
1611
  if l <= n:
1594
1612
  yield b
@@ -1616,7 +1634,7 @@ async def bytes_ensure_part_async_iter(
1616
1634
  ) -> AsyncIterator[Buffer]:
1617
1635
  n = partsize
1618
1636
  async for b in ensure_aiter(it):
1619
- m = memoryview(b)
1637
+ m = memoryview(b).cast("B")
1620
1638
  l = buffer_length(m)
1621
1639
  if l <= n:
1622
1640
  yield b
@@ -1730,7 +1748,7 @@ def copyfileobj(
1730
1748
  fsrc_readinto = getattr(fsrc, "readinto", None)
1731
1749
  if callable(fsrc_readinto):
1732
1750
  buf = bytearray(chunksize)
1733
- view = memoryview(buf)
1751
+ view = memoryview(buf).cast("B")
1734
1752
  while size := fsrc_readinto(buf):
1735
1753
  fdst_write(view[:size])
1736
1754
  elif callable(fsrc_read):
@@ -1757,7 +1775,7 @@ async def copyfileobj_async(
1757
1775
  if callable(fsrc_readinto):
1758
1776
  fsrc_readinto = ensure_async(fsrc_readinto, threaded=threaded)
1759
1777
  buf = bytearray(chunksize)
1760
- view = memoryview(buf)
1778
+ view = memoryview(buf).cast("B")
1761
1779
  while size := await fsrc_readinto(buf):
1762
1780
  await fdst_write(view[:size])
1763
1781
  elif callable(fsrc_read):
@@ -1798,7 +1816,7 @@ def bound_bytes_reader(
1798
1816
  if f_readinto is None:
1799
1817
  raise NotImplementedError("readinto")
1800
1818
  if size > 0:
1801
- n = f_readinto(memoryview(buffer)[:size])
1819
+ n = f_readinto(memoryview(buffer).cast("B")[:size])
1802
1820
  size -= n
1803
1821
  return n
1804
1822
  return 0
@@ -1833,7 +1851,7 @@ def bound_async_bytes_reader(
1833
1851
  if f_readinto is None:
1834
1852
  raise NotImplementedError("readinto")
1835
1853
  if size > 0:
1836
- n = await f_readinto(memoryview(buffer)[:size])
1854
+ n = await f_readinto(memoryview(buffer).cast("B")[:size])
1837
1855
  size -= n
1838
1856
  return n
1839
1857
  return 0
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "python-filewrap"
3
- version = "0.2.9.1"
3
+ version = "0.3.0.1"
4
4
  description = "Python file wrappers."
5
5
  authors = ["ChenyangGao <wosiwujm@gmail.com>"]
6
6
  license = "MIT"