omlish 0.0.0.dev264__py3-none-any.whl → 0.0.0.dev266__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.
- omlish/__about__.py +5 -5
- omlish/collections/__init__.py +5 -0
- omlish/collections/abc.py +24 -0
- omlish/collections/cache/descriptor.py +3 -0
- omlish/collections/cache/impl.py +3 -0
- omlish/collections/cache/types.py +3 -0
- omlish/collections/coerce.py +2 -1
- omlish/collections/frozen.py +3 -0
- omlish/collections/hasheq.py +3 -0
- omlish/collections/identity.py +3 -0
- omlish/collections/kv/__init__.py +51 -0
- omlish/collections/kv/base.py +55 -0
- omlish/collections/kv/capabilities.py +46 -0
- omlish/collections/kv/filtered.py +101 -0
- omlish/collections/kv/mappings.py +76 -0
- omlish/collections/kv/transformed.py +123 -0
- omlish/collections/kv/wrappers.py +99 -0
- omlish/collections/mappings.py +3 -0
- omlish/collections/ordered.py +3 -0
- omlish/collections/persistent/persistent.py +3 -0
- omlish/collections/persistent/treap.py +5 -1
- omlish/collections/persistent/treapmap.py +3 -0
- omlish/collections/sorted/sorted.py +3 -0
- omlish/collections/unmodifiable.py +3 -0
- omlish/inject/bindings.py +3 -0
- omlish/inject/eagers.py +3 -0
- omlish/inject/elements.py +4 -1
- omlish/inject/impl/elements.py +3 -0
- omlish/inject/impl/injector.py +3 -0
- omlish/inject/impl/multis.py +3 -0
- omlish/inject/impl/proxy.py +3 -0
- omlish/inject/impl/scopes.py +3 -0
- omlish/inject/injector.py +3 -0
- omlish/inject/inspect.py +3 -0
- omlish/inject/keys.py +3 -0
- omlish/inject/listeners.py +3 -0
- omlish/inject/multis.py +2 -0
- omlish/inject/origins.py +3 -0
- omlish/inject/overrides.py +3 -0
- omlish/inject/privates.py +3 -0
- omlish/inject/providers.py +3 -0
- omlish/inject/types.py +3 -0
- omlish/inject/utils.py +3 -0
- omlish/lang/__init__.py +2 -0
- omlish/lang/functions.py +14 -1
- omlish/lang/objects.py +18 -0
- omlish/term/codes.py +25 -17
- omlish/term/progressbar.py +29 -8
- {omlish-0.0.0.dev264.dist-info → omlish-0.0.0.dev266.dist-info}/METADATA +7 -7
- {omlish-0.0.0.dev264.dist-info → omlish-0.0.0.dev266.dist-info}/RECORD +54 -47
- {omlish-0.0.0.dev264.dist-info → omlish-0.0.0.dev266.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev264.dist-info → omlish-0.0.0.dev266.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev264.dist-info → omlish-0.0.0.dev266.dist-info}/licenses/LICENSE +0 -0
- {omlish-0.0.0.dev264.dist-info → omlish-0.0.0.dev266.dist-info}/top_level.txt +0 -0
omlish/collections/mappings.py
CHANGED
omlish/collections/ordered.py
CHANGED
omlish/inject/bindings.py
CHANGED
omlish/inject/eagers.py
CHANGED
omlish/inject/elements.py
CHANGED
@@ -6,6 +6,9 @@ from .. import lang
|
|
6
6
|
from .impl.origins import HasOriginsImpl
|
7
7
|
|
8
8
|
|
9
|
+
##
|
10
|
+
|
11
|
+
|
9
12
|
class Element(HasOriginsImpl, lang.Abstract, lang.PackageSealed):
|
10
13
|
"""Note: inheritors must be dataclasses."""
|
11
14
|
|
@@ -29,7 +32,7 @@ class Elements(lang.Final):
|
|
29
32
|
yield from c
|
30
33
|
|
31
34
|
|
32
|
-
Elemental = ta.Union[ # noqa
|
35
|
+
Elemental: ta.TypeAlias = ta.Union[ # noqa
|
33
36
|
Element,
|
34
37
|
Elements,
|
35
38
|
ElementGenerator,
|
omlish/inject/impl/elements.py
CHANGED
omlish/inject/impl/injector.py
CHANGED
omlish/inject/impl/multis.py
CHANGED
omlish/inject/impl/proxy.py
CHANGED
omlish/inject/impl/scopes.py
CHANGED
omlish/inject/injector.py
CHANGED
omlish/inject/inspect.py
CHANGED
omlish/inject/keys.py
CHANGED
omlish/inject/listeners.py
CHANGED
omlish/inject/multis.py
CHANGED
@@ -69,6 +69,7 @@ class MapProvider(Provider):
|
|
69
69
|
class SetBinder(ElementGenerator, ta.Generic[T]):
|
70
70
|
def __init__(self, *, tag: ta.Any = None) -> None:
|
71
71
|
super().__init__()
|
72
|
+
|
72
73
|
self._tag: ta.Any = tag
|
73
74
|
self._sbs: list[SetBinding] = []
|
74
75
|
|
@@ -96,6 +97,7 @@ class SetBinder(ElementGenerator, ta.Generic[T]):
|
|
96
97
|
class MapBinder(ElementGenerator, ta.Generic[K, V]):
|
97
98
|
def __init__(self, *, tag: ta.Any = None) -> None:
|
98
99
|
super().__init__()
|
100
|
+
|
99
101
|
self._tag: ta.Any = tag
|
100
102
|
self._mbs: list[MapBinding] = []
|
101
103
|
|
omlish/inject/origins.py
CHANGED
omlish/inject/overrides.py
CHANGED
omlish/inject/privates.py
CHANGED
omlish/inject/providers.py
CHANGED
omlish/inject/types.py
CHANGED
omlish/inject/utils.py
CHANGED
@@ -8,6 +8,9 @@ from .impl.origins import HasOriginsImpl
|
|
8
8
|
T = ta.TypeVar('T')
|
9
9
|
|
10
10
|
|
11
|
+
##
|
12
|
+
|
13
|
+
|
11
14
|
@dc.dataclass(frozen=True, eq=False)
|
12
15
|
class ConstFn(HasOriginsImpl, lang.Final, ta.Generic[T]):
|
13
16
|
"""An origin tracking provider function for a constant value. Equivalent to `lambda: v` but transparent."""
|
omlish/lang/__init__.py
CHANGED
@@ -147,6 +147,7 @@ from .functions import ( # noqa
|
|
147
147
|
raise_,
|
148
148
|
raising,
|
149
149
|
recurse,
|
150
|
+
strict_constant,
|
150
151
|
try_,
|
151
152
|
void,
|
152
153
|
)
|
@@ -199,6 +200,7 @@ from .maybes import ( # noqa
|
|
199
200
|
|
200
201
|
from .objects import ( # noqa
|
201
202
|
SimpleProxy,
|
203
|
+
anon_object,
|
202
204
|
arg_repr,
|
203
205
|
attr_repr,
|
204
206
|
build_mro_dict,
|
omlish/lang/functions.py
CHANGED
@@ -92,16 +92,29 @@ def opt_fn(fn: ta.Callable[[F], T]) -> ta.Callable[[F | None], T | None]:
|
|
92
92
|
return inner
|
93
93
|
|
94
94
|
|
95
|
-
|
95
|
+
##
|
96
|
+
|
97
|
+
|
98
|
+
class _constant(ta.Generic[T]): # noqa
|
96
99
|
def __init__(self, obj: T) -> None:
|
97
100
|
super().__init__()
|
98
101
|
|
99
102
|
self._obj = obj
|
100
103
|
|
104
|
+
|
105
|
+
class constant(_constant[T]): # noqa
|
106
|
+
def __call__(self, *args: ta.Any, **kwargs: ta.Any) -> T:
|
107
|
+
return self._obj
|
108
|
+
|
109
|
+
|
110
|
+
class strict_constant(_constant[T]): # noqa
|
101
111
|
def __call__(self) -> T:
|
102
112
|
return self._obj
|
103
113
|
|
104
114
|
|
115
|
+
##
|
116
|
+
|
117
|
+
|
105
118
|
def is_none(o: ta.Any) -> bool:
|
106
119
|
return o is None
|
107
120
|
|
omlish/lang/objects.py
CHANGED
@@ -199,3 +199,21 @@ class SimpleProxy(ta.Generic[T]):
|
|
199
199
|
|
200
200
|
def __delattr__(self, item):
|
201
201
|
delattr(object.__getattribute__(self, '__wrapped__'), item)
|
202
|
+
|
203
|
+
|
204
|
+
##
|
205
|
+
|
206
|
+
|
207
|
+
class _AnonObject:
|
208
|
+
def __init__(self, **attrs: ta.Any) -> None:
|
209
|
+
super().__init__()
|
210
|
+
|
211
|
+
for k, v in attrs.items():
|
212
|
+
setattr(self, k, v)
|
213
|
+
|
214
|
+
def __init_subclass__(cls, **kwargs):
|
215
|
+
raise TypeError
|
216
|
+
|
217
|
+
|
218
|
+
def anon_object(**attrs: ta.Any) -> ta.Any:
|
219
|
+
return _AnonObject(**attrs)
|
omlish/term/codes.py
CHANGED
@@ -29,6 +29,7 @@ def strip_ansi_codes(s: str) -> str:
|
|
29
29
|
class ControlSequence:
|
30
30
|
def __init__(self, fn: ta.Callable[..., str], desc: str) -> None:
|
31
31
|
super().__init__()
|
32
|
+
|
32
33
|
self._fn = fn
|
33
34
|
self._desc = desc
|
34
35
|
|
@@ -40,19 +41,6 @@ class ControlSequence:
|
|
40
41
|
return self._fn(*args, **kwargs)
|
41
42
|
|
42
43
|
|
43
|
-
CUU = ControlSequence(lambda n: CSI + str(n) + 'A', 'Cursor Up')
|
44
|
-
CUD = ControlSequence(lambda n: CSI + str(n) + 'B', 'Cursor Down')
|
45
|
-
CUF = ControlSequence(lambda n: CSI + str(n) + 'C', 'Cursor Forward')
|
46
|
-
CUB = ControlSequence(lambda n: CSI + str(n) + 'D', 'Cursor Back')
|
47
|
-
|
48
|
-
CNL = ControlSequence(lambda n: CSI + str(n) + 'E', 'Cursor Next Line')
|
49
|
-
CPL = ControlSequence(lambda n: CSI + str(n) + 'F', 'Cursor Previous Line')
|
50
|
-
CHA = ControlSequence(lambda n: CSI + str(n) + 'G', 'Cursor Horizontal Line Absolute')
|
51
|
-
|
52
|
-
CUP = ControlSequence(lambda n, m: CSI + str(n) + ';' + str(m) + 'H', 'Cursor Position')
|
53
|
-
HVP = ControlSequence(lambda n, m: CSI + str(n) + ';' + str(m) + 'f', 'Horizontal Vertical Position')
|
54
|
-
|
55
|
-
|
56
44
|
def _str_val(val: ta.Any) -> str:
|
57
45
|
if isinstance(val, enum.Enum):
|
58
46
|
return str(val.value)
|
@@ -60,6 +48,26 @@ def _str_val(val: ta.Any) -> str:
|
|
60
48
|
return str(val)
|
61
49
|
|
62
50
|
|
51
|
+
def _opt_str_val(v):
|
52
|
+
if v is None:
|
53
|
+
return ''
|
54
|
+
else:
|
55
|
+
return _str_val(v)
|
56
|
+
|
57
|
+
|
58
|
+
CUU = ControlSequence(lambda n=None: CSI + _opt_str_val(n) + 'A', 'Cursor Up')
|
59
|
+
CUD = ControlSequence(lambda n=None: CSI + _opt_str_val(n) + 'B', 'Cursor Down')
|
60
|
+
CUF = ControlSequence(lambda n=None: CSI + _opt_str_val(n) + 'C', 'Cursor Forward')
|
61
|
+
CUB = ControlSequence(lambda n=None: CSI + _opt_str_val(n) + 'D', 'Cursor Back')
|
62
|
+
|
63
|
+
CNL = ControlSequence(lambda n=None: CSI + _opt_str_val(n) + 'E', 'Cursor Next Line')
|
64
|
+
CPL = ControlSequence(lambda n=None: CSI + _opt_str_val(n) + 'F', 'Cursor Previous Line')
|
65
|
+
CHA = ControlSequence(lambda n=None: CSI + _opt_str_val(n) + 'G', 'Cursor Horizontal Line Absolute')
|
66
|
+
|
67
|
+
CUP = ControlSequence(lambda n, m: CSI + str(n) + ';' + str(m) + 'H', 'Cursor Position')
|
68
|
+
HVP = ControlSequence(lambda n, m: CSI + str(n) + ';' + str(m) + 'f', 'Horizontal Vertical Position')
|
69
|
+
|
70
|
+
|
63
71
|
class EDs(enum.Enum):
|
64
72
|
FROM_CURSOR_TO_END = 0
|
65
73
|
FROM_CURSOR_TO_BEGINNING = 1
|
@@ -67,7 +75,7 @@ class EDs(enum.Enum):
|
|
67
75
|
ALL_AND_SCROLLBACK = 3
|
68
76
|
|
69
77
|
|
70
|
-
ED = ControlSequence(lambda n: CSI +
|
78
|
+
ED = ControlSequence(lambda n=None: CSI + _opt_str_val(n) + 'J', 'Erase in Display')
|
71
79
|
|
72
80
|
|
73
81
|
class ELs(enum.Enum):
|
@@ -76,10 +84,10 @@ class ELs(enum.Enum):
|
|
76
84
|
ALL = 2
|
77
85
|
|
78
86
|
|
79
|
-
EL = ControlSequence(lambda n: CSI +
|
87
|
+
EL = ControlSequence(lambda n=None: CSI + _opt_str_val(n) + 'K', 'Erase in Line')
|
80
88
|
|
81
|
-
SU = ControlSequence(lambda n: CSI +
|
82
|
-
SD = ControlSequence(lambda n: CSI +
|
89
|
+
SU = ControlSequence(lambda n=None: CSI + _opt_str_val(n) + 'S', 'Scroll Up')
|
90
|
+
SD = ControlSequence(lambda n=None: CSI + _opt_str_val(n) + 'T', 'Scroll Down')
|
83
91
|
|
84
92
|
DSR = ControlSequence(lambda: CSI + '6n', 'Device Status Report')
|
85
93
|
|
omlish/term/progressbar.py
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# ruff: noqa: UP006 UP007
|
2
|
+
# @omlish-lite
|
1
3
|
import sys
|
2
4
|
import time
|
3
5
|
import typing as ta
|
@@ -20,12 +22,12 @@ class ProgressBar:
|
|
20
22
|
|
21
23
|
def __init__(
|
22
24
|
self,
|
23
|
-
total: int
|
25
|
+
total: ta.Optional[int] = None,
|
24
26
|
*,
|
25
27
|
length: int = 40,
|
26
28
|
interval: float = .2,
|
27
|
-
start_time: float
|
28
|
-
out: ta.TextIO
|
29
|
+
start_time: ta.Optional[float] = None,
|
30
|
+
out: ta.Optional[ta.TextIO] = None,
|
29
31
|
) -> None:
|
30
32
|
super().__init__()
|
31
33
|
|
@@ -73,17 +75,25 @@ class ProgressBar:
|
|
73
75
|
info = ' | '.join(info_parts)
|
74
76
|
return f'{bar} {info}'
|
75
77
|
|
78
|
+
# Note: omitted, kept lite for now
|
79
|
+
# _LINE_UPDATE_PREFIX: ta.ClassVar[str] = ''.join([
|
80
|
+
# codes.EL(codes.ELs.ALL),
|
81
|
+
# codes.CHA(),
|
82
|
+
# ])
|
83
|
+
|
84
|
+
_LINE_UPDATE_PREFIX: ta.ClassVar[str] = '\033[2K\033['
|
85
|
+
|
76
86
|
def print(
|
77
87
|
self,
|
78
88
|
*,
|
79
|
-
now: float
|
89
|
+
now: ta.Optional[float] = None,
|
80
90
|
**kwargs: ta.Any,
|
81
91
|
) -> None:
|
82
92
|
if now is None:
|
83
93
|
now = time.time()
|
84
94
|
|
85
95
|
line = self.render(**kwargs)
|
86
|
-
self._out.write(f'
|
96
|
+
self._out.write(f'{self._LINE_UPDATE_PREFIX}{line}')
|
87
97
|
self._out.flush()
|
88
98
|
|
89
99
|
self._last_print = now
|
@@ -92,7 +102,7 @@ class ProgressBar:
|
|
92
102
|
self,
|
93
103
|
n: int = 1,
|
94
104
|
*,
|
95
|
-
now: float
|
105
|
+
now: ta.Optional[float] = None,
|
96
106
|
silent: bool = False,
|
97
107
|
) -> None:
|
98
108
|
if now is None:
|
@@ -110,8 +120,8 @@ def progress_bar(
|
|
110
120
|
seq: ta.Iterable[T],
|
111
121
|
*,
|
112
122
|
no_tty_check: bool = False,
|
113
|
-
total: int
|
114
|
-
out: ta.TextIO
|
123
|
+
total: ta.Optional[int] = None,
|
124
|
+
out: ta.Optional[ta.TextIO] = None,
|
115
125
|
**kwargs: ta.Any,
|
116
126
|
) -> ta.Generator[T, None, None]:
|
117
127
|
if out is None:
|
@@ -137,3 +147,14 @@ def progress_bar(
|
|
137
147
|
|
138
148
|
pb.print(complete=True)
|
139
149
|
out.write('\n')
|
150
|
+
|
151
|
+
|
152
|
+
##
|
153
|
+
|
154
|
+
|
155
|
+
if __name__ == '__main__':
|
156
|
+
def _main() -> None:
|
157
|
+
for _ in progress_bar(range(100), no_tty_check=True):
|
158
|
+
time.sleep(0.01)
|
159
|
+
|
160
|
+
_main()
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: omlish
|
3
|
-
Version: 0.0.0.
|
3
|
+
Version: 0.0.0.dev266
|
4
4
|
Summary: omlish
|
5
5
|
Author: wrmsr
|
6
6
|
License: BSD-3-Clause
|
@@ -39,10 +39,10 @@ Requires-Dist: pymysql~=1.1; extra == "all"
|
|
39
39
|
Requires-Dist: aiomysql~=0.2; extra == "all"
|
40
40
|
Requires-Dist: aiosqlite~=0.21; extra == "all"
|
41
41
|
Requires-Dist: asyncpg~=0.30; extra == "all"
|
42
|
-
Requires-Dist: apsw~=3.
|
43
|
-
Requires-Dist: sqlean.py~=3.
|
42
|
+
Requires-Dist: apsw~=3.49; extra == "all"
|
43
|
+
Requires-Dist: sqlean.py~=3.47; extra == "all"
|
44
44
|
Requires-Dist: duckdb~=1.2; extra == "all"
|
45
|
-
Requires-Dist: pytest~=8.
|
45
|
+
Requires-Dist: pytest~=8.3; extra == "all"
|
46
46
|
Requires-Dist: anyio~=4.9; extra == "all"
|
47
47
|
Requires-Dist: sniffio~=1.3; extra == "all"
|
48
48
|
Requires-Dist: asttokens~=3.0; extra == "all"
|
@@ -85,11 +85,11 @@ Requires-Dist: pymysql~=1.1; extra == "sqldrivers"
|
|
85
85
|
Requires-Dist: aiomysql~=0.2; extra == "sqldrivers"
|
86
86
|
Requires-Dist: aiosqlite~=0.21; extra == "sqldrivers"
|
87
87
|
Requires-Dist: asyncpg~=0.30; extra == "sqldrivers"
|
88
|
-
Requires-Dist: apsw~=3.
|
89
|
-
Requires-Dist: sqlean.py~=3.
|
88
|
+
Requires-Dist: apsw~=3.49; extra == "sqldrivers"
|
89
|
+
Requires-Dist: sqlean.py~=3.47; extra == "sqldrivers"
|
90
90
|
Requires-Dist: duckdb~=1.2; extra == "sqldrivers"
|
91
91
|
Provides-Extra: testing
|
92
|
-
Requires-Dist: pytest~=8.
|
92
|
+
Requires-Dist: pytest~=8.3; extra == "testing"
|
93
93
|
Provides-Extra: plus
|
94
94
|
Requires-Dist: anyio~=4.9; extra == "plus"
|
95
95
|
Requires-Dist: sniffio~=1.3; extra == "plus"
|