ominfra 0.0.0.dev129__tar.gz → 0.0.0.dev131__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. {ominfra-0.0.0.dev129/ominfra.egg-info → ominfra-0.0.0.dev131}/PKG-INFO +3 -3
  2. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/deploy/_executor.py +16 -1
  3. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/deploy/poly/_main.py +2 -2
  4. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/pyremote/_runcommands.py +16 -1
  5. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/scripts/journald2aws.py +117 -5
  6. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/scripts/supervisor.py +1450 -703
  7. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/configs.py +17 -17
  8. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/dispatchers.py +7 -6
  9. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/dispatchersimpl.py +11 -15
  10. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/groups.py +16 -1
  11. ominfra-0.0.0.dev131/ominfra/supervisor/http.py +130 -0
  12. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/inject.py +44 -5
  13. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/io.py +39 -24
  14. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/pipes.py +2 -2
  15. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/privileges.py +4 -6
  16. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/processimpl.py +33 -34
  17. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/setupimpl.py +16 -16
  18. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/spawningimpl.py +3 -3
  19. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/supervisor.py +6 -3
  20. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/types.py +6 -56
  21. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/utils/os.py +1 -1
  22. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/utils/strings.py +2 -2
  23. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131/ominfra.egg-info}/PKG-INFO +3 -3
  24. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra.egg-info/SOURCES.txt +1 -1
  25. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra.egg-info/requires.txt +2 -2
  26. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/pyproject.toml +3 -3
  27. ominfra-0.0.0.dev129/ominfra/supervisor/poller.py +0 -240
  28. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/LICENSE +0 -0
  29. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/MANIFEST.in +0 -0
  30. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/README.rst +0 -0
  31. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/.manifests.json +0 -0
  32. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/__about__.py +0 -0
  33. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/__init__.py +0 -0
  34. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/clouds/__init__.py +0 -0
  35. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/clouds/aws/__init__.py +0 -0
  36. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/clouds/aws/__main__.py +0 -0
  37. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/clouds/aws/auth.py +0 -0
  38. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/clouds/aws/cli.py +0 -0
  39. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/clouds/aws/dataclasses.py +0 -0
  40. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/clouds/aws/journald2aws/__init__.py +0 -0
  41. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/clouds/aws/journald2aws/__main__.py +0 -0
  42. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/clouds/aws/journald2aws/cursor.py +0 -0
  43. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/clouds/aws/journald2aws/driver.py +0 -0
  44. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/clouds/aws/journald2aws/main.py +0 -0
  45. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/clouds/aws/journald2aws/poster.py +0 -0
  46. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/clouds/aws/logs.py +0 -0
  47. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/clouds/aws/metadata.py +0 -0
  48. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/clouds/gcp/__init__.py +0 -0
  49. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/clouds/gcp/auth.py +0 -0
  50. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/cmds.py +0 -0
  51. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/configs.py +0 -0
  52. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/deploy/__init__.py +0 -0
  53. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/deploy/configs.py +0 -0
  54. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/deploy/executor/__init__.py +0 -0
  55. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/deploy/executor/base.py +0 -0
  56. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/deploy/executor/concerns/__init__.py +0 -0
  57. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/deploy/executor/concerns/dirs.py +0 -0
  58. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/deploy/executor/concerns/nginx.py +0 -0
  59. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/deploy/executor/concerns/repo.py +0 -0
  60. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/deploy/executor/concerns/supervisor.py +0 -0
  61. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/deploy/executor/concerns/systemd.py +0 -0
  62. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/deploy/executor/concerns/user.py +0 -0
  63. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/deploy/executor/concerns/venv.py +0 -0
  64. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/deploy/executor/main.py +0 -0
  65. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/deploy/poly/__init__.py +0 -0
  66. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/deploy/poly/base.py +0 -0
  67. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/deploy/poly/configs.py +0 -0
  68. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/deploy/poly/deploy.py +0 -0
  69. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/deploy/poly/main.py +0 -0
  70. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/deploy/poly/nginx.py +0 -0
  71. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/deploy/poly/repo.py +0 -0
  72. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/deploy/poly/runtime.py +0 -0
  73. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/deploy/poly/site.py +0 -0
  74. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/deploy/poly/supervisor.py +0 -0
  75. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/deploy/poly/venv.py +0 -0
  76. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/deploy/remote.py +0 -0
  77. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/journald/__init__.py +0 -0
  78. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/journald/fields.py +0 -0
  79. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/journald/genmessages.py +0 -0
  80. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/journald/messages.py +0 -0
  81. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/journald/tailer.py +0 -0
  82. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/manage/__init__.py +0 -0
  83. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/manage/manage.py +0 -0
  84. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/pyremote/__init__.py +0 -0
  85. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/pyremote/bootstrap.py +0 -0
  86. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/pyremote/runcommands.py +0 -0
  87. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/scripts/__init__.py +0 -0
  88. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/ssh.py +0 -0
  89. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/LICENSE.txt +0 -0
  90. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/__init__.py +0 -0
  91. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/__main__.py +0 -0
  92. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/events.py +0 -0
  93. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/exceptions.py +0 -0
  94. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/groupsimpl.py +0 -0
  95. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/main.py +0 -0
  96. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/process.py +0 -0
  97. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/setup.py +0 -0
  98. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/signals.py +0 -0
  99. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/spawning.py +0 -0
  100. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/states.py +0 -0
  101. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/utils/__init__.py +0 -0
  102. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/utils/collections.py +0 -0
  103. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/utils/diag.py +0 -0
  104. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/utils/fds.py +0 -0
  105. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/utils/fs.py +0 -0
  106. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/utils/ostypes.py +0 -0
  107. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/utils/signals.py +0 -0
  108. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/supervisor/utils/users.py +0 -0
  109. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/tailscale/__init__.py +0 -0
  110. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/tailscale/api.py +0 -0
  111. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/tailscale/cli.py +0 -0
  112. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/threadworkers.py +0 -0
  113. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/tools/__init__.py +0 -0
  114. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra/tools/listresources.py +0 -0
  115. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra.egg-info/dependency_links.txt +0 -0
  116. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra.egg-info/entry_points.txt +0 -0
  117. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/ominfra.egg-info/top_level.txt +0 -0
  118. {ominfra-0.0.0.dev129 → ominfra-0.0.0.dev131}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ominfra
3
- Version: 0.0.0.dev129
3
+ Version: 0.0.0.dev131
4
4
  Summary: ominfra
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -12,8 +12,8 @@ Classifier: Operating System :: OS Independent
12
12
  Classifier: Operating System :: POSIX
13
13
  Requires-Python: >=3.12
14
14
  License-File: LICENSE
15
- Requires-Dist: omdev==0.0.0.dev129
16
- Requires-Dist: omlish==0.0.0.dev129
15
+ Requires-Dist: omdev==0.0.0.dev131
16
+ Requires-Dist: omlish==0.0.0.dev131
17
17
  Provides-Extra: all
18
18
  Requires-Dist: paramiko~=3.5; extra == "all"
19
19
  Requires-Dist: asyncssh~=2.18; extra == "all"
@@ -82,9 +82,12 @@ if sys.version_info < (3, 8):
82
82
  ########################################
83
83
 
84
84
 
85
- # ../../../../omlish/lite/cached.py
85
+ # ../../../omlish/lite/cached.py
86
86
  T = ta.TypeVar('T')
87
87
 
88
+ # ../../../omlish/lite/check.py
89
+ SizedT = ta.TypeVar('SizedT', bound=ta.Sized)
90
+
88
91
 
89
92
  ########################################
90
93
  # ../../configs.py
@@ -218,6 +221,18 @@ def check_single(vs: ta.Iterable[T]) -> T:
218
221
  return v
219
222
 
220
223
 
224
+ def check_empty(v: SizedT) -> SizedT:
225
+ if len(v):
226
+ raise ValueError(v)
227
+ return v
228
+
229
+
230
+ def check_non_empty(v: SizedT) -> SizedT:
231
+ if not len(v):
232
+ raise ValueError(v)
233
+ return v
234
+
235
+
221
236
  ########################################
222
237
  # ../../../../omlish/lite/json.py
223
238
 
@@ -33,10 +33,10 @@ if sys.version_info < (3, 8):
33
33
  ########################################
34
34
 
35
35
 
36
- # ../../../../omlish/lite/cached.py
36
+ # ../../../omlish/lite/cached.py
37
37
  T = ta.TypeVar('T')
38
38
 
39
- # ../base.py
39
+ # base.py
40
40
  ConcernT = ta.TypeVar('ConcernT')
41
41
  ConfigT = ta.TypeVar('ConfigT')
42
42
  SiteConcernT = ta.TypeVar('SiteConcernT', bound='SiteConcern')
@@ -41,9 +41,12 @@ if sys.version_info < (3, 8):
41
41
  ########################################
42
42
 
43
43
 
44
- # ../../../omlish/lite/cached.py
44
+ # ../../omlish/lite/cached.py
45
45
  T = ta.TypeVar('T')
46
46
 
47
+ # ../../omlish/lite/check.py
48
+ SizedT = ta.TypeVar('SizedT', bound=ta.Sized)
49
+
47
50
 
48
51
  ########################################
49
52
  # ../bootstrap.py
@@ -301,6 +304,18 @@ def check_single(vs: ta.Iterable[T]) -> T:
301
304
  return v
302
305
 
303
306
 
307
+ def check_empty(v: SizedT) -> SizedT:
308
+ if len(v):
309
+ raise ValueError(v)
310
+ return v
311
+
312
+
313
+ def check_non_empty(v: SizedT) -> SizedT:
314
+ if not len(v):
315
+ raise ValueError(v)
316
+ return v
317
+
318
+
304
319
  ########################################
305
320
  # ../../../omlish/lite/json.py
306
321
 
@@ -51,21 +51,24 @@ if sys.version_info < (3, 8):
51
51
  ########################################
52
52
 
53
53
 
54
- # ../../../../../omdev/toml/parser.py
54
+ # ../../../../omdev/toml/parser.py
55
55
  TomlParseFloat = ta.Callable[[str], ta.Any]
56
56
  TomlKey = ta.Tuple[str, ...]
57
57
  TomlPos = int # ta.TypeAlias
58
58
 
59
- # ../../../../../omlish/lite/cached.py
59
+ # ../../../../omlish/lite/cached.py
60
60
  T = ta.TypeVar('T')
61
61
 
62
- # ../../../../../omlish/lite/contextmanagers.py
62
+ # ../../../../omlish/lite/check.py
63
+ SizedT = ta.TypeVar('SizedT', bound=ta.Sized)
64
+
65
+ # ../../../../omlish/lite/contextmanagers.py
63
66
  ExitStackedT = ta.TypeVar('ExitStackedT', bound='ExitStacked')
64
67
 
65
- # ../../../../configs.py
68
+ # ../../../configs.py
66
69
  ConfigMapping = ta.Mapping[str, ta.Any]
67
70
 
68
- # ../../../../threadworkers.py
71
+ # ../../../threadworkers.py
69
72
  ThreadWorkerT = ta.TypeVar('ThreadWorkerT', bound='ThreadWorker')
70
73
 
71
74
 
@@ -997,6 +1000,18 @@ def check_single(vs: ta.Iterable[T]) -> T:
997
1000
  return v
998
1001
 
999
1002
 
1003
+ def check_empty(v: SizedT) -> SizedT:
1004
+ if len(v):
1005
+ raise ValueError(v)
1006
+ return v
1007
+
1008
+
1009
+ def check_non_empty(v: SizedT) -> SizedT:
1010
+ if not len(v):
1011
+ raise ValueError(v)
1012
+ return v
1013
+
1014
+
1000
1015
  ########################################
1001
1016
  # ../../../../../omlish/lite/json.py
1002
1017
 
@@ -1754,6 +1769,103 @@ class DelimitingBuffer:
1754
1769
  i = p
1755
1770
 
1756
1771
 
1772
+ class ReadableListBuffer:
1773
+ def __init__(self) -> None:
1774
+ super().__init__()
1775
+ self._lst: list[bytes] = []
1776
+
1777
+ def feed(self, d: bytes) -> None:
1778
+ if d:
1779
+ self._lst.append(d)
1780
+
1781
+ def _chop(self, i: int, e: int) -> bytes:
1782
+ lst = self._lst
1783
+ d = lst[i]
1784
+
1785
+ o = b''.join([
1786
+ *lst[:i],
1787
+ d[:e],
1788
+ ])
1789
+
1790
+ self._lst = [
1791
+ *([d[e:]] if e < len(d) else []),
1792
+ *lst[i + 1:],
1793
+ ]
1794
+
1795
+ return o
1796
+
1797
+ def read(self, n: ta.Optional[int] = None) -> ta.Optional[bytes]:
1798
+ if n is None:
1799
+ o = b''.join(self._lst)
1800
+ self._lst = []
1801
+ return o
1802
+
1803
+ if not (lst := self._lst):
1804
+ return None
1805
+
1806
+ c = 0
1807
+ for i, d in enumerate(lst):
1808
+ r = n - c
1809
+ if (l := len(d)) >= r:
1810
+ return self._chop(i, r)
1811
+ c += l
1812
+
1813
+ return None
1814
+
1815
+ def read_until(self, delim: bytes = b'\n') -> ta.Optional[bytes]:
1816
+ if not (lst := self._lst):
1817
+ return None
1818
+
1819
+ for i, d in enumerate(lst):
1820
+ if (p := d.find(delim)) >= 0:
1821
+ return self._chop(i, p + len(delim))
1822
+
1823
+ return None
1824
+
1825
+
1826
+ class IncrementalWriteBuffer:
1827
+ def __init__(
1828
+ self,
1829
+ data: bytes,
1830
+ *,
1831
+ write_size: int = 0x10000,
1832
+ ) -> None:
1833
+ super().__init__()
1834
+
1835
+ check_non_empty(data)
1836
+ self._len = len(data)
1837
+ self._write_size = write_size
1838
+
1839
+ self._lst = [
1840
+ data[i:i + write_size]
1841
+ for i in range(0, len(data), write_size)
1842
+ ]
1843
+ self._pos = 0
1844
+
1845
+ @property
1846
+ def rem(self) -> int:
1847
+ return self._len - self._pos
1848
+
1849
+ def write(self, fn: ta.Callable[[bytes], int]) -> int:
1850
+ lst = check_non_empty(self._lst)
1851
+
1852
+ t = 0
1853
+ for i, d in enumerate(lst): # noqa
1854
+ n = fn(check_non_empty(d))
1855
+ if not n:
1856
+ break
1857
+ t += n
1858
+
1859
+ if t:
1860
+ self._lst = [
1861
+ *([d[n:]] if n < len(d) else []),
1862
+ *lst[i + 1:],
1863
+ ]
1864
+ self._pos += t
1865
+
1866
+ return t
1867
+
1868
+
1757
1869
  ########################################
1758
1870
  # ../../../../../omlish/lite/logs.py
1759
1871
  """