reykit 1.1.10__py3-none-any.whl → 1.1.12__py3-none-any.whl
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.
- reykit/rmultitask.py +68 -3
- reykit/ros.py +83 -5
- {reykit-1.1.10.dist-info → reykit-1.1.12.dist-info}/METADATA +1 -1
- {reykit-1.1.10.dist-info → reykit-1.1.12.dist-info}/RECORD +6 -6
- {reykit-1.1.10.dist-info → reykit-1.1.12.dist-info}/WHEEL +0 -0
- {reykit-1.1.10.dist-info → reykit-1.1.12.dist-info}/licenses/LICENSE +0 -0
reykit/rmultitask.py
CHANGED
@@ -10,8 +10,8 @@
|
|
10
10
|
|
11
11
|
|
12
12
|
from __future__ import annotations
|
13
|
-
from typing import Any, Literal
|
14
|
-
from collections.abc import Callable, Iterable, Generator, Coroutine
|
13
|
+
from typing import Any, Literal, Self
|
14
|
+
from collections.abc import Callable, Iterable, Iterator, Generator, Coroutine, AsyncIterator
|
15
15
|
from threading import RLock as TRLock, get_ident as threading_get_ident
|
16
16
|
from concurrent.futures import ThreadPoolExecutor, Future as CFuture, as_completed as concurrent_as_completed
|
17
17
|
from asyncio import (
|
@@ -36,7 +36,8 @@ __all__ = (
|
|
36
36
|
'RThreadLock',
|
37
37
|
'RAsyncLock',
|
38
38
|
'RThreadPool',
|
39
|
-
'RAsyncPool'
|
39
|
+
'RAsyncPool',
|
40
|
+
'RAsyncIterator'
|
40
41
|
)
|
41
42
|
|
42
43
|
|
@@ -868,3 +869,67 @@ class RAsyncPool(object):
|
|
868
869
|
|
869
870
|
|
870
871
|
__mul__ = repeat
|
872
|
+
|
873
|
+
|
874
|
+
class RAsyncIterator(AsyncIterator):
|
875
|
+
"""
|
876
|
+
Rey's `asynchronous iterator` type.
|
877
|
+
"""
|
878
|
+
|
879
|
+
|
880
|
+
def __init__(
|
881
|
+
self,
|
882
|
+
task: Callable,
|
883
|
+
args_iter: Iterable[Iterable] | None = None,
|
884
|
+
kwargs_iter: Iterable[dict] | None = None
|
885
|
+
) -> None:
|
886
|
+
"""
|
887
|
+
Build `asynchronous iterator` attributes.
|
888
|
+
|
889
|
+
Parameters
|
890
|
+
----------
|
891
|
+
task : Asynchronous task.
|
892
|
+
args_iter : Iterable of task position arguments.
|
893
|
+
kwargs_iter : Iterable of task keyword arguments.
|
894
|
+
"""
|
895
|
+
|
896
|
+
# Set attribute.
|
897
|
+
self.task = task
|
898
|
+
if args_iter is not None:
|
899
|
+
args_iter: Iterator[Iterable] = iter(args_iter)
|
900
|
+
self.args_iter = args_iter
|
901
|
+
if kwargs_iter is not None:
|
902
|
+
kwargs_iter: Iterator[dict] = iter(kwargs_iter)
|
903
|
+
self.kwargs_iter = kwargs_iter
|
904
|
+
|
905
|
+
|
906
|
+
def __aiter__(self) -> Self:
|
907
|
+
"""
|
908
|
+
Get asynchronous iterator.
|
909
|
+
"""
|
910
|
+
|
911
|
+
return self
|
912
|
+
|
913
|
+
|
914
|
+
async def __anext__(self):
|
915
|
+
"""
|
916
|
+
Get next value from asynchronous iterator.
|
917
|
+
"""
|
918
|
+
|
919
|
+
# Get parameter.
|
920
|
+
args = ()
|
921
|
+
kwargs = {}
|
922
|
+
|
923
|
+
## Next.
|
924
|
+
try:
|
925
|
+
if self.args_iter is not None:
|
926
|
+
args = next(self.args_iter)
|
927
|
+
if self.kwargs_iter is not None:
|
928
|
+
kwargs = next(self.kwargs_iter)
|
929
|
+
except StopIteration:
|
930
|
+
raise StopAsyncIteration
|
931
|
+
|
932
|
+
# Execute.
|
933
|
+
result = self.task(*args, **kwargs)
|
934
|
+
|
935
|
+
return result
|
reykit/ros.py
CHANGED
@@ -10,7 +10,9 @@
|
|
10
10
|
|
11
11
|
|
12
12
|
from __future__ import annotations
|
13
|
-
from typing import Any, Literal, overload
|
13
|
+
from typing import Any, Literal, TextIO, BinaryIO, overload, TYPE_CHECKING
|
14
|
+
if TYPE_CHECKING:
|
15
|
+
from _typeshed import OpenTextMode, OpenBinaryMode
|
14
16
|
from io import TextIOBase, BufferedIOBase
|
15
17
|
from os import (
|
16
18
|
walk as os_walk,
|
@@ -317,6 +319,84 @@ class RFile(object):
|
|
317
319
|
self.path = os_abspath(path)
|
318
320
|
|
319
321
|
|
322
|
+
@overload
|
323
|
+
def open(
|
324
|
+
self,
|
325
|
+
mode: OpenTextMode = 'wb+'
|
326
|
+
) -> TextIO: ...
|
327
|
+
|
328
|
+
@overload
|
329
|
+
def open(
|
330
|
+
self,
|
331
|
+
mode: OpenBinaryMode = 'wb+'
|
332
|
+
) -> BinaryIO: ...
|
333
|
+
|
334
|
+
def open(
|
335
|
+
self,
|
336
|
+
mode: OpenTextMode | OpenBinaryMode = 'wb+'
|
337
|
+
) -> TextIO | BinaryIO:
|
338
|
+
"""
|
339
|
+
Open file.
|
340
|
+
|
341
|
+
Parameters
|
342
|
+
----------
|
343
|
+
mode : Open mode.
|
344
|
+
|
345
|
+
Returns
|
346
|
+
-------
|
347
|
+
IO object.
|
348
|
+
"""
|
349
|
+
|
350
|
+
# Get parameter.
|
351
|
+
if (
|
352
|
+
(
|
353
|
+
'r' in mode
|
354
|
+
or '+' in mode
|
355
|
+
)
|
356
|
+
and 'b' not in mode
|
357
|
+
):
|
358
|
+
encoding = 'utf-8'
|
359
|
+
else:
|
360
|
+
encoding = None
|
361
|
+
|
362
|
+
# Open.
|
363
|
+
io = open(self.path, mode, encoding=encoding)
|
364
|
+
|
365
|
+
return io
|
366
|
+
|
367
|
+
|
368
|
+
@overload
|
369
|
+
def __getattr__(self, name: Literal['open_r', 'open_w', 'open_a']) -> TextIO: ...
|
370
|
+
|
371
|
+
@overload
|
372
|
+
def __getattr__(self, name: Literal['open_rb', 'open_wb', 'open_ab']) -> BinaryIO: ...
|
373
|
+
|
374
|
+
def __getattr__(self, name: Literal['open_r', 'open_w', 'open_a', 'open_rb', 'open_wb', 'open_ab']) -> TextIO | BinaryIO:
|
375
|
+
"""
|
376
|
+
Get attribute.
|
377
|
+
|
378
|
+
Parameters
|
379
|
+
----------
|
380
|
+
name : Open mode.
|
381
|
+
|
382
|
+
Returns
|
383
|
+
-------
|
384
|
+
IO object.
|
385
|
+
"""
|
386
|
+
|
387
|
+
if name in (
|
388
|
+
'open_r',
|
389
|
+
'open_w',
|
390
|
+
'open_a',
|
391
|
+
'open_rb',
|
392
|
+
'open_wb',
|
393
|
+
'open_ab'
|
394
|
+
):
|
395
|
+
mode: Literal['r', 'w', 'a', 'rb', 'wb', 'ab'] = name[5:]
|
396
|
+
io = self.open(mode)
|
397
|
+
return io
|
398
|
+
|
399
|
+
|
320
400
|
@overload
|
321
401
|
def read(
|
322
402
|
self,
|
@@ -351,13 +431,11 @@ class RFile(object):
|
|
351
431
|
match type_:
|
352
432
|
case 'bytes':
|
353
433
|
mode = 'rb'
|
354
|
-
encoding = None
|
355
434
|
case 'str':
|
356
435
|
mode = 'r'
|
357
|
-
encoding='utf-8'
|
358
436
|
|
359
437
|
# Read.
|
360
|
-
with open(
|
438
|
+
with self.open(mode) as file:
|
361
439
|
content = file.read()
|
362
440
|
|
363
441
|
return content
|
@@ -398,7 +476,7 @@ class RFile(object):
|
|
398
476
|
data = str(data)
|
399
477
|
|
400
478
|
# Write.
|
401
|
-
with open(
|
479
|
+
with self.open(mode) as file:
|
402
480
|
file.write(data)
|
403
481
|
|
404
482
|
|
@@ -7,9 +7,9 @@ reykit/rexception.py,sha256=ftXVdEVkU0B0HXbKjQTiJRJVVGbvhorwWtMiplpN9Zk,8118
|
|
7
7
|
reykit/rimage.py,sha256=fQpIHX6Go3Jk_MDgsSDnZx27EZHumyGdgI9xyjP5lYQ,6275
|
8
8
|
reykit/rlog.py,sha256=qhmATMv3_bJRaiuN9mo8hSf_95HH5Lw838aJFio98sg,25760
|
9
9
|
reykit/rmonkey.py,sha256=RqhmKXabl11s2RJaGizpm00Q1yEkul1Je5uxw8_thUk,7584
|
10
|
-
reykit/rmultitask.py,sha256=
|
10
|
+
reykit/rmultitask.py,sha256=5oWApPnOrYrDDDZunTasAf8nmvrwBlKhS63cvSsi1iE,23599
|
11
11
|
reykit/rnumber.py,sha256=XseLDNLDOt-XYP2P9oDbkKYuHudeSoWzIHsOENO8vvE,3196
|
12
|
-
reykit/ros.py,sha256=
|
12
|
+
reykit/ros.py,sha256=6fHKCpxoWmCpxlRpGag5E-GzGsh0xt8YEmx9iqDvN_o,40780
|
13
13
|
reykit/rrandom.py,sha256=TfQKYXRw379MMRIZYfjBtCkmsartA9thhDIG1fc3tM4,9233
|
14
14
|
reykit/rregex.py,sha256=XTlnDLior8yyncFdrTr9FsVlBcqMXvsWRfpmvQS-BR8,6089
|
15
15
|
reykit/rschedule.py,sha256=7EH_6TdEhwV-T6YyBEGYEcy85I1vTSNutDci-e_veTY,5796
|
@@ -24,7 +24,7 @@ reykit/rzip.py,sha256=i6KkmeSWCnq025d-O1mbuCYezNRUhyY9OGVK0CRlNAM,3522
|
|
24
24
|
reykit/rdll/__init__.py,sha256=vM9V7wSNno-WH9RrxgHTIgCkQm8LmBFoLFO8z7qovNo,306
|
25
25
|
reykit/rdll/rdll_inject.py,sha256=bETl8tywtN1OiQudbA21u6GwBM_bqVX7jbiisNj_JBg,645
|
26
26
|
reykit/rdll/rdll_inject_core.py,sha256=Trgh_pdJs_Lw-Y-0Kkn8kHr4BnilM9dBKnHnX25T_pM,5092
|
27
|
-
reykit-1.1.
|
28
|
-
reykit-1.1.
|
29
|
-
reykit-1.1.
|
30
|
-
reykit-1.1.
|
27
|
+
reykit-1.1.12.dist-info/METADATA,sha256=5mIrvjJ0mmU7omM998GB5RHL566x2lfhXgIN3ZKuHSk,1889
|
28
|
+
reykit-1.1.12.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
29
|
+
reykit-1.1.12.dist-info/licenses/LICENSE,sha256=UYLPqp7BvPiH8yEZduJqmmyEl6hlM3lKrFIefiD4rvk,1059
|
30
|
+
reykit-1.1.12.dist-info/RECORD,,
|
File without changes
|
File without changes
|