omlish 0.0.0.dev447__py3-none-any.whl → 0.0.0.dev484__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.

Potentially problematic release.


This version of omlish might be problematic. Click here for more details.

Files changed (226) hide show
  1. omlish/.omlish-manifests.json +12 -0
  2. omlish/__about__.py +15 -15
  3. omlish/argparse/all.py +17 -9
  4. omlish/argparse/cli.py +16 -3
  5. omlish/argparse/utils.py +21 -0
  6. omlish/asyncs/asyncio/rlock.py +110 -0
  7. omlish/asyncs/asyncio/sync.py +43 -0
  8. omlish/asyncs/asyncio/utils.py +2 -0
  9. omlish/asyncs/sync.py +25 -0
  10. omlish/bootstrap/_marshal.py +1 -1
  11. omlish/bootstrap/diag.py +12 -21
  12. omlish/bootstrap/main.py +2 -5
  13. omlish/bootstrap/sys.py +27 -28
  14. omlish/cexts/__init__.py +0 -0
  15. omlish/cexts/include/omlish/omlish.hh +1 -0
  16. omlish/collections/__init__.py +13 -1
  17. omlish/collections/attrregistry.py +210 -0
  18. omlish/collections/cache/impl.py +1 -0
  19. omlish/collections/identity.py +1 -0
  20. omlish/collections/mappings.py +28 -0
  21. omlish/collections/trie.py +5 -1
  22. omlish/collections/utils.py +77 -0
  23. omlish/concurrent/all.py +2 -1
  24. omlish/concurrent/futures.py +25 -0
  25. omlish/concurrent/threadlets.py +1 -1
  26. omlish/daemons/reparent.py +2 -3
  27. omlish/daemons/spawning.py +2 -3
  28. omlish/dataclasses/__init__.py +2 -0
  29. omlish/dataclasses/impl/api/classes/decorator.py +3 -0
  30. omlish/dataclasses/impl/api/classes/make.py +3 -0
  31. omlish/dataclasses/impl/concerns/repr.py +15 -2
  32. omlish/dataclasses/impl/configs.py +97 -37
  33. omlish/dataclasses/impl/generation/compilation.py +21 -19
  34. omlish/dataclasses/impl/generation/globals.py +1 -0
  35. omlish/dataclasses/impl/generation/ops.py +1 -0
  36. omlish/dataclasses/impl/generation/processor.py +105 -24
  37. omlish/dataclasses/impl/processing/base.py +8 -0
  38. omlish/dataclasses/impl/processing/driving.py +8 -8
  39. omlish/dataclasses/specs.py +1 -0
  40. omlish/dataclasses/tools/modifiers.py +5 -0
  41. omlish/diag/cmds/__init__.py +0 -0
  42. omlish/diag/{lslocks.py → cmds/lslocks.py} +6 -6
  43. omlish/diag/{lsof.py → cmds/lsof.py} +6 -6
  44. omlish/diag/{ps.py → cmds/ps.py} +6 -6
  45. omlish/diag/pycharm.py +16 -2
  46. omlish/diag/pydevd.py +58 -40
  47. omlish/diag/replserver/console.py +1 -1
  48. omlish/dispatch/__init__.py +18 -12
  49. omlish/dispatch/methods.py +50 -140
  50. omlish/dom/rendering.py +1 -1
  51. omlish/formats/dotenv.py +1 -1
  52. omlish/formats/json/stream/__init__.py +13 -0
  53. omlish/funcs/guard.py +225 -0
  54. omlish/graphs/dot/rendering.py +1 -1
  55. omlish/http/all.py +44 -4
  56. omlish/http/clients/asyncs.py +33 -27
  57. omlish/http/clients/base.py +17 -1
  58. omlish/http/clients/coro/__init__.py +0 -0
  59. omlish/http/clients/coro/sync.py +171 -0
  60. omlish/http/clients/default.py +208 -29
  61. omlish/http/clients/executor.py +56 -0
  62. omlish/http/clients/httpx.py +72 -11
  63. omlish/http/clients/middleware.py +181 -0
  64. omlish/http/clients/sync.py +33 -27
  65. omlish/http/clients/syncasync.py +49 -0
  66. omlish/http/clients/urllib.py +6 -3
  67. omlish/http/coro/client/connection.py +15 -6
  68. omlish/http/coro/io.py +2 -0
  69. omlish/http/flasky/__init__.py +40 -0
  70. omlish/http/flasky/_compat.py +2 -0
  71. omlish/http/flasky/api.py +82 -0
  72. omlish/http/flasky/app.py +203 -0
  73. omlish/http/flasky/cvs.py +59 -0
  74. omlish/http/flasky/requests.py +20 -0
  75. omlish/http/flasky/responses.py +23 -0
  76. omlish/http/flasky/routes.py +23 -0
  77. omlish/http/flasky/types.py +15 -0
  78. omlish/http/urls.py +67 -0
  79. omlish/inject/__init__.py +38 -18
  80. omlish/inject/_dataclasses.py +4986 -0
  81. omlish/inject/binder.py +4 -48
  82. omlish/inject/elements.py +27 -0
  83. omlish/inject/helpers/__init__.py +0 -0
  84. omlish/inject/{utils.py → helpers/constfn.py} +3 -3
  85. omlish/inject/{tags.py → helpers/id.py} +2 -2
  86. omlish/inject/helpers/multis.py +143 -0
  87. omlish/inject/helpers/wrappers.py +54 -0
  88. omlish/inject/impl/elements.py +47 -17
  89. omlish/inject/impl/injector.py +20 -19
  90. omlish/inject/impl/inspect.py +10 -1
  91. omlish/inject/impl/maysync.py +3 -4
  92. omlish/inject/impl/multis.py +3 -0
  93. omlish/inject/impl/sync.py +3 -4
  94. omlish/inject/injector.py +31 -2
  95. omlish/inject/inspect.py +35 -0
  96. omlish/inject/maysync.py +2 -4
  97. omlish/inject/multis.py +8 -0
  98. omlish/inject/overrides.py +3 -3
  99. omlish/inject/privates.py +6 -0
  100. omlish/inject/providers.py +3 -2
  101. omlish/inject/sync.py +5 -4
  102. omlish/io/buffers.py +118 -0
  103. omlish/io/readers.py +29 -0
  104. omlish/iterators/transforms.py +2 -2
  105. omlish/lang/__init__.py +178 -97
  106. omlish/lang/_asyncs.cc +186 -0
  107. omlish/lang/asyncs.py +17 -0
  108. omlish/lang/casing.py +11 -0
  109. omlish/lang/contextmanagers.py +28 -4
  110. omlish/lang/functions.py +31 -22
  111. omlish/lang/imports/_capture.cc +11 -9
  112. omlish/lang/imports/capture.py +363 -170
  113. omlish/lang/imports/proxy.py +455 -152
  114. omlish/lang/lazyglobals.py +22 -9
  115. omlish/lang/params.py +17 -0
  116. omlish/lang/recursion.py +0 -1
  117. omlish/lang/sequences.py +124 -0
  118. omlish/lite/abstract.py +54 -24
  119. omlish/lite/asyncs.py +2 -2
  120. omlish/lite/attrops.py +2 -0
  121. omlish/lite/contextmanagers.py +4 -4
  122. omlish/lite/dataclasses.py +44 -0
  123. omlish/lite/maybes.py +8 -0
  124. omlish/lite/maysync.py +1 -5
  125. omlish/lite/pycharm.py +1 -1
  126. omlish/lite/typing.py +6 -0
  127. omlish/logs/all.py +1 -1
  128. omlish/logs/utils.py +1 -1
  129. omlish/manifests/loading.py +2 -1
  130. omlish/marshal/__init__.py +33 -13
  131. omlish/marshal/_dataclasses.py +2774 -0
  132. omlish/marshal/base/configs.py +12 -0
  133. omlish/marshal/base/contexts.py +36 -21
  134. omlish/marshal/base/funcs.py +8 -11
  135. omlish/marshal/base/options.py +8 -0
  136. omlish/marshal/base/registries.py +146 -44
  137. omlish/marshal/base/types.py +40 -16
  138. omlish/marshal/composite/iterables.py +33 -20
  139. omlish/marshal/composite/literals.py +20 -18
  140. omlish/marshal/composite/mappings.py +36 -23
  141. omlish/marshal/composite/maybes.py +29 -19
  142. omlish/marshal/composite/newtypes.py +16 -16
  143. omlish/marshal/composite/optionals.py +14 -14
  144. omlish/marshal/composite/special.py +15 -15
  145. omlish/marshal/composite/unions/__init__.py +0 -0
  146. omlish/marshal/composite/unions/literals.py +93 -0
  147. omlish/marshal/composite/unions/primitives.py +103 -0
  148. omlish/marshal/factories/invalidate.py +18 -68
  149. omlish/marshal/factories/method.py +26 -0
  150. omlish/marshal/factories/moduleimport/factories.py +22 -65
  151. omlish/marshal/factories/multi.py +13 -25
  152. omlish/marshal/factories/recursive.py +42 -56
  153. omlish/marshal/factories/typecache.py +29 -74
  154. omlish/marshal/factories/typemap.py +42 -43
  155. omlish/marshal/objects/dataclasses.py +129 -106
  156. omlish/marshal/objects/marshal.py +18 -14
  157. omlish/marshal/objects/namedtuples.py +48 -42
  158. omlish/marshal/objects/unmarshal.py +19 -15
  159. omlish/marshal/polymorphism/marshal.py +9 -11
  160. omlish/marshal/polymorphism/metadata.py +16 -5
  161. omlish/marshal/polymorphism/standard.py +13 -1
  162. omlish/marshal/polymorphism/unions.py +15 -105
  163. omlish/marshal/polymorphism/unmarshal.py +9 -10
  164. omlish/marshal/singular/enums.py +14 -18
  165. omlish/marshal/standard.py +10 -6
  166. omlish/marshal/trivial/any.py +1 -1
  167. omlish/marshal/trivial/forbidden.py +21 -26
  168. omlish/metadata.py +23 -1
  169. omlish/os/forkhooks.py +4 -0
  170. omlish/os/pidfiles/pinning.py +2 -2
  171. omlish/reflect/types.py +1 -0
  172. omlish/secrets/marshal.py +1 -1
  173. omlish/specs/jmespath/__init__.py +12 -3
  174. omlish/specs/jmespath/_dataclasses.py +2893 -0
  175. omlish/specs/jmespath/ast.py +1 -1
  176. omlish/specs/jsonrpc/__init__.py +13 -0
  177. omlish/specs/jsonrpc/_marshal.py +32 -23
  178. omlish/specs/jsonrpc/conns.py +10 -7
  179. omlish/specs/jsonschema/_marshal.py +1 -1
  180. omlish/specs/jsonschema/keywords/__init__.py +7 -0
  181. omlish/specs/jsonschema/keywords/_dataclasses.py +1644 -0
  182. omlish/specs/openapi/_marshal.py +31 -22
  183. omlish/sql/{tabledefs/alchemy.py → alchemy/tabledefs.py} +2 -2
  184. omlish/sql/queries/_marshal.py +2 -2
  185. omlish/sql/queries/rendering.py +1 -1
  186. omlish/sql/tabledefs/_marshal.py +1 -1
  187. omlish/subprocesses/base.py +4 -0
  188. omlish/subprocesses/editor.py +1 -1
  189. omlish/sync.py +155 -21
  190. omlish/term/alt.py +60 -0
  191. omlish/term/confirm.py +8 -8
  192. omlish/term/pager.py +235 -0
  193. omlish/term/terminfo.py +935 -0
  194. omlish/term/termstate.py +67 -0
  195. omlish/term/vt100/terminal.py +0 -3
  196. omlish/testing/pytest/plugins/asyncs/fixtures.py +4 -1
  197. omlish/testing/pytest/plugins/skips.py +2 -1
  198. omlish/testing/unittest/main.py +3 -3
  199. omlish/text/docwrap/__init__.py +3 -0
  200. omlish/text/docwrap/__main__.py +11 -0
  201. omlish/text/docwrap/api.py +83 -0
  202. omlish/text/docwrap/cli.py +86 -0
  203. omlish/text/docwrap/groups.py +84 -0
  204. omlish/text/docwrap/lists.py +167 -0
  205. omlish/text/docwrap/parts.py +146 -0
  206. omlish/text/docwrap/reflowing.py +106 -0
  207. omlish/text/docwrap/rendering.py +151 -0
  208. omlish/text/docwrap/utils.py +11 -0
  209. omlish/text/docwrap/wrapping.py +59 -0
  210. omlish/text/filecache.py +2 -2
  211. omlish/text/lorem.py +6 -0
  212. omlish/text/parts.py +2 -2
  213. omlish/text/textwrap.py +51 -0
  214. omlish/typedvalues/marshal.py +85 -59
  215. omlish/typedvalues/values.py +2 -1
  216. {omlish-0.0.0.dev447.dist-info → omlish-0.0.0.dev484.dist-info}/METADATA +29 -28
  217. {omlish-0.0.0.dev447.dist-info → omlish-0.0.0.dev484.dist-info}/RECORD +222 -171
  218. omlish/dataclasses/impl/generation/mangling.py +0 -18
  219. omlish/funcs/match.py +0 -227
  220. omlish/marshal/factories/match.py +0 -34
  221. omlish/marshal/factories/simple.py +0 -28
  222. /omlish/inject/impl/{providers2.py → providersmap.py} +0 -0
  223. {omlish-0.0.0.dev447.dist-info → omlish-0.0.0.dev484.dist-info}/WHEEL +0 -0
  224. {omlish-0.0.0.dev447.dist-info → omlish-0.0.0.dev484.dist-info}/entry_points.txt +0 -0
  225. {omlish-0.0.0.dev447.dist-info → omlish-0.0.0.dev484.dist-info}/licenses/LICENSE +0 -0
  226. {omlish-0.0.0.dev447.dist-info → omlish-0.0.0.dev484.dist-info}/top_level.txt +0 -0
@@ -1,18 +0,0 @@
1
- from ....text.mangle import StringMangler
2
-
3
-
4
- ##
5
-
6
-
7
- ESCAPED_IDENT_CHARS = ''.join(
8
- chr(i)
9
- for i in range(128)
10
- if not (
11
- chr(i).isalpha() or
12
- chr(i).isdigit() or
13
- chr(i) == '_' or
14
- ord(chr(i)) > 127
15
- )
16
- )
17
-
18
- IDENT_MANGLER = StringMangler.of('_', ESCAPED_IDENT_CHARS)
omlish/funcs/match.py DELETED
@@ -1,227 +0,0 @@
1
- """
2
- Analogous to scala's partial functions ( https://www.scala-lang.org/api/current/scala/PartialFunction.html ).
3
-
4
- TODO:
5
- - unify MatchFnClass with dispatch.method?
6
- - __call__ = mfs.method(); @__call__.register(lambda: ...) def _call_... ?
7
- - not really the same thing, dispatch is unordered this is necessarily ordered
8
- """
9
- import abc
10
- import dataclasses as dc
11
- import typing as ta
12
-
13
- from .. import lang
14
-
15
-
16
- T = ta.TypeVar('T')
17
- P = ta.ParamSpec('P')
18
-
19
-
20
- ##
21
-
22
-
23
- class MatchGuardError(Exception):
24
- pass
25
-
26
-
27
- class MatchFn(lang.Abstract, ta.Generic[P, T]):
28
- @abc.abstractmethod
29
- def guard(self, *args: P.args, **kwargs: P.kwargs) -> bool:
30
- raise NotImplementedError
31
-
32
- @abc.abstractmethod
33
- def fn(self, *args: P.args, **kwargs: P.kwargs) -> T:
34
- raise NotImplementedError
35
-
36
- def __get__(self, instance, owner=None):
37
- return self
38
-
39
- @ta.final
40
- def __call__(self, *args: P.args, **kwargs: P.kwargs) -> T:
41
- if not self.guard(*args, **kwargs):
42
- raise MatchGuardError(*args, **kwargs)
43
- return self.fn(*args, **kwargs)
44
-
45
-
46
- ##
47
-
48
-
49
- @dc.dataclass(frozen=True)
50
- class SimpleMatchFn(MatchFn[P, T]):
51
- _guard: ta.Callable[P, bool]
52
- _fn: ta.Callable[P, T]
53
-
54
- def guard(self, *args: P.args, **kwargs: P.kwargs) -> bool:
55
- return self._guard(*args, **kwargs)
56
-
57
- def fn(self, *args: P.args, **kwargs: P.kwargs) -> T:
58
- return self._fn(*args, **kwargs)
59
-
60
- def __get__(self, instance, owner=None):
61
- return self.__class__(
62
- self._guard.__get__(instance, owner), # noqa
63
- self._fn.__get__(instance, owner), # noqa
64
- )
65
-
66
-
67
- @ta.overload
68
- def simple(guard: ta.Callable[..., bool], fn: ta.Callable[P, T]) -> SimpleMatchFn[P, T]:
69
- ...
70
-
71
-
72
- @ta.overload
73
- def simple(guard: ta.Callable[..., bool]) -> ta.Callable[[ta.Callable[P, T]], SimpleMatchFn[P, T]]:
74
- ...
75
-
76
-
77
- def simple(guard, fn=None):
78
- def inner(fn): # noqa
79
- return SimpleMatchFn(guard, fn)
80
- if fn is not None:
81
- return inner(fn)
82
- else:
83
- return inner
84
-
85
-
86
- ##
87
-
88
-
89
- class AmbiguousMatchesError(Exception):
90
- pass
91
-
92
-
93
- @dc.dataclass(frozen=True)
94
- class MultiMatchFn(MatchFn[P, T]):
95
- children: ta.Sequence[MatchFn[P, T]]
96
- strict: bool = False
97
-
98
- def match(self, *args: P.args, **kwargs: P.kwargs) -> MatchFn[P, T] | None:
99
- matches = []
100
- for cur in self.children:
101
- if cur.guard(*args, **kwargs):
102
- if self.strict:
103
- matches.append(cur)
104
- else:
105
- return cur
106
- if not matches:
107
- return None
108
- elif len(matches) > 1:
109
- raise AmbiguousMatchesError
110
- else:
111
- return matches[0]
112
-
113
- def guard(self, *args: P.args, **kwargs: P.kwargs) -> bool:
114
- return self.match(*args, **kwargs) is not None
115
-
116
- def fn(self, *args: P.args, **kwargs: P.kwargs) -> T:
117
- if (m := self.match(*args, **kwargs)) is None:
118
- raise MatchGuardError(*args, **kwargs)
119
- return m.fn(*args, **kwargs)
120
-
121
- def __get__(self, instance, owner=None):
122
- return self.__class__(
123
- [c.__get__(instance, owner) for c in self.children],
124
- strict=self.strict,
125
- )
126
-
127
-
128
- def multi(*children: MatchFn[P, T], strict: bool = False) -> MultiMatchFn: # MultiMatchFn[P[0], T[-1]]
129
- return MultiMatchFn(children, strict=strict) # noqa
130
-
131
-
132
- ##
133
-
134
-
135
- class CachedMatchFn(MatchFn[P, T]):
136
- @staticmethod
137
- def _default_key(*args, **kwargs):
138
- return (args, tuple(sorted(kwargs.items(), key=lambda t: t[0])))
139
-
140
- def __init__(
141
- self,
142
- f: MatchFn[P, T],
143
- *,
144
- key: ta.Callable[P, ta.Any] = _default_key,
145
- lock: lang.DefaultLockable = None,
146
- ) -> None:
147
- super().__init__()
148
-
149
- self._f = f
150
- self._key = key
151
- self._lock = lock
152
- self._lock_impl = lang.default_lock(lock)()
153
- self._dct: dict[ta.Any, lang.Maybe[ta.Any]] = {}
154
-
155
- def guard(self, *args: P.args, **kwargs: P.kwargs) -> bool:
156
- with self._lock_impl:
157
- k = self._key(*args, **kwargs)
158
- try:
159
- e = self._dct[k]
160
- except KeyError:
161
- if self._f.guard(*args, **kwargs):
162
- return True
163
- else:
164
- self._dct[k] = lang.empty()
165
- return False
166
- else:
167
- return e.present
168
-
169
- def fn(self, *args: P.args, **kwargs: P.kwargs) -> T:
170
- with self._lock_impl:
171
- k = self._key(*args, **kwargs)
172
- try:
173
- e = self._dct[k]
174
- except KeyError:
175
- try:
176
- ret = self._f(*args, **kwargs)
177
- except MatchGuardError:
178
- self._dct[k] = lang.empty()
179
- raise
180
- else:
181
- self._dct[k] = lang.just(ret)
182
- return ret
183
- else:
184
- if e.present:
185
- return e.must()
186
- else:
187
- raise MatchGuardError(*args, **kwargs)
188
-
189
- def __get__(self, instance, owner=None):
190
- return self.__class__(self._f.__get__(instance, owner), key=self._key) # noqa
191
-
192
-
193
- cached = CachedMatchFn
194
-
195
-
196
- ##
197
-
198
-
199
- class MatchFnClass(MatchFn[P, T]):
200
- _cls_match_fn: ta.ClassVar[MultiMatchFn]
201
-
202
- __match_fn: MatchFn[P, T] | None = None
203
-
204
- @property
205
- def _match_fn(self) -> MatchFn[P, T]:
206
- if (mf := self.__match_fn) is None:
207
- mf = self.__match_fn = self._cls_match_fn.__get__(self)
208
- return mf
209
-
210
- def __init_subclass__(cls, strict: bool = False, **kwargs: ta.Any) -> None:
211
- super().__init_subclass__(**kwargs)
212
-
213
- if '_cls_match_fn' in cls.__dict__:
214
- raise AttributeError('_cls_match_fn')
215
-
216
- d = {}
217
- for c in cls.__mro__:
218
- for a, o in c.__dict__.items():
219
- if isinstance(o, MatchFn) and a not in d:
220
- d[a] = o
221
- cls._cls_match_fn = MultiMatchFn(list(d.values()), strict=strict)
222
-
223
- def guard(self, *args: P.args, **kwargs: P.kwargs) -> bool:
224
- return self._match_fn.guard(*args, **kwargs)
225
-
226
- def fn(self, *args: P.args, **kwargs: P.kwargs) -> T:
227
- return self._match_fn.fn(*args, **kwargs)
@@ -1,34 +0,0 @@
1
- from ... import lang
2
- from ... import reflect as rfl
3
- from ...funcs import match as mfs
4
- from ..base.contexts import MarshalContext
5
- from ..base.contexts import UnmarshalContext
6
- from ..base.types import Marshaler
7
- from ..base.types import MarshalerFactory
8
- from ..base.types import MarshalerMaker
9
- from ..base.types import Unmarshaler
10
- from ..base.types import UnmarshalerFactory
11
- from ..base.types import UnmarshalerMaker
12
-
13
-
14
- ##
15
-
16
-
17
- class MarshalerFactoryMatchClass(
18
- MarshalerFactory,
19
- mfs.MatchFnClass[[MarshalContext, rfl.Type], Marshaler],
20
- lang.Abstract,
21
- ):
22
- @property
23
- def make_marshaler(self) -> MarshalerMaker:
24
- return self # noqa
25
-
26
-
27
- class UnmarshalerFactoryMatchClass(
28
- UnmarshalerFactory,
29
- mfs.MatchFnClass[[UnmarshalContext, rfl.Type], Unmarshaler],
30
- lang.Abstract,
31
- ):
32
- @property
33
- def make_unmarshaler(self) -> UnmarshalerMaker:
34
- return self # noqa
@@ -1,28 +0,0 @@
1
- from ... import lang
2
- from ..base.types import MarshalerFactory
3
- from ..base.types import MarshalerMaker
4
- from ..base.types import UnmarshalerFactory
5
- from ..base.types import UnmarshalerMaker
6
-
7
-
8
- ##
9
-
10
-
11
- class SimpleMarshalerFactory(
12
- MarshalerFactory,
13
- MarshalerMaker,
14
- lang.Abstract,
15
- ):
16
- @property
17
- def make_marshaler(self) -> MarshalerMaker:
18
- return self # noqa
19
-
20
-
21
- class SimpleUnmarshalerFactory(
22
- UnmarshalerFactory,
23
- UnmarshalerMaker,
24
- lang.Abstract,
25
- ):
26
- @property
27
- def make_unmarshaler(self) -> UnmarshalerMaker:
28
- return self # noqa
File without changes