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
@@ -176,6 +176,18 @@ async def async_maybe_managing(obj: T) -> ta.AsyncGenerator[T]:
176
176
  yield obj
177
177
 
178
178
 
179
+ @contextlib.asynccontextmanager
180
+ async def async_or_sync_maybe_managing(obj: T) -> ta.AsyncGenerator[T]:
181
+ if isinstance(obj, ta.AsyncContextManager):
182
+ async with obj:
183
+ yield obj
184
+ elif isinstance(obj, ta.ContextManager):
185
+ with obj:
186
+ yield obj
187
+ else:
188
+ yield obj
189
+
190
+
179
191
  ##
180
192
 
181
193
 
@@ -394,8 +406,8 @@ def double_check_setdefault(
394
406
 
395
407
  def call_with_exit_stack(
396
408
  fn: ta.Callable[ta.Concatenate[contextlib.ExitStack, P], T],
397
- *args: ta.Any,
398
- **kwargs: ta.Any,
409
+ *args: P.args,
410
+ **kwargs: P.kwargs,
399
411
  ) -> T:
400
412
  with contextlib.ExitStack() as es:
401
413
  return fn(es, *args, **kwargs)
@@ -403,8 +415,20 @@ def call_with_exit_stack(
403
415
 
404
416
  async def call_with_async_exit_stack(
405
417
  fn: ta.Callable[ta.Concatenate[contextlib.AsyncExitStack, P], ta.Awaitable[T]],
406
- *args: ta.Any,
407
- **kwargs: ta.Any,
418
+ *args: P.args,
419
+ **kwargs: P.kwargs,
408
420
  ) -> T:
409
421
  async with contextlib.AsyncExitStack() as aes:
410
422
  return await fn(aes, *args, **kwargs)
423
+
424
+
425
+ def with_exit_stack(
426
+ fn: ta.Callable[ta.Concatenate[contextlib.ExitStack, P], T],
427
+ ) -> ta.Callable[P, T]:
428
+ return functools.partial(call_with_exit_stack, fn)
429
+
430
+
431
+ def with_async_exit_stack(
432
+ fn: ta.Callable[ta.Concatenate[contextlib.AsyncExitStack, P], ta.Awaitable[T]],
433
+ ) -> ta.Callable[P, ta.Awaitable[T]]:
434
+ return functools.partial(call_with_async_exit_stack, fn)
omlish/lang/functions.py CHANGED
@@ -29,7 +29,18 @@ def call_with(fn: ta.Any, *args: ta.Any, **kwargs: ta.Any) -> ta.Callable[[T], T
29
29
  return inner
30
30
 
31
31
 
32
- def maybe_call(obj: ta.Any, att: str, *args, default: ta.Any = None, **kwargs: ta.Any) -> ta.Any:
32
+ def opt_fn(fn: ta.Callable[[F], T]) -> ta.Callable[[F | None], T | None]:
33
+ @functools.wraps(fn)
34
+ def inner(v: F | None) -> T | None:
35
+ if v is not None:
36
+ return fn(v)
37
+ else:
38
+ return None
39
+
40
+ return inner
41
+
42
+
43
+ def opt_call(obj: ta.Any, att: str, *args, default: ta.Any = None, **kwargs: ta.Any) -> ta.Any:
33
44
  try:
34
45
  fn = getattr(obj, att)
35
46
  except AttributeError:
@@ -39,7 +50,7 @@ def maybe_call(obj: ta.Any, att: str, *args, default: ta.Any = None, **kwargs: t
39
50
 
40
51
 
41
52
  def recurse(fn: ta.Callable[..., T], *args, **kwargs) -> T:
42
- def rec(*args, **kwargs) -> T:
53
+ def rec(*args, **kwargs) -> T: # noqa
43
54
  return fn(rec, *args, **kwargs)
44
55
 
45
56
  return rec(*args, **kwargs)
@@ -48,11 +59,11 @@ def recurse(fn: ta.Callable[..., T], *args, **kwargs) -> T:
48
59
  ##
49
60
 
50
61
 
51
- def raise_(o: BaseException) -> ta.NoReturn:
62
+ def raise_(o: BaseException | type[BaseException]) -> ta.NoReturn:
52
63
  raise o
53
64
 
54
65
 
55
- def raising(o: BaseException) -> ta.Callable[..., ta.NoReturn]:
66
+ def raising(o: BaseException | type[BaseException]) -> ta.Callable[..., ta.NoReturn]:
56
67
  def inner(*args, **kwargs):
57
68
  raise o
58
69
 
@@ -91,20 +102,6 @@ def identity(obj: T) -> T:
91
102
  return obj
92
103
 
93
104
 
94
- def opt_fn(fn: ta.Callable[[F], T]) -> ta.Callable[[F | None], T | None]:
95
- @functools.wraps(fn)
96
- def inner(v: F | None) -> T | None:
97
- if v is not None:
98
- return fn(v)
99
- else:
100
- return None
101
-
102
- return inner
103
-
104
-
105
- ##
106
-
107
-
108
105
  class _constant(ta.Generic[T]): # noqa
109
106
  def __init__(self, obj: T) -> None:
110
107
  super().__init__()
@@ -198,6 +195,13 @@ def periodically(
198
195
  ##
199
196
 
200
197
 
198
+ def opt_getattr(obj: ta.Any, att: str, default: ta.Any = None) -> ta.Any:
199
+ try:
200
+ return getattr(obj, att)
201
+ except AttributeError:
202
+ return default
203
+
204
+
201
205
  def coalesce(*vs: T | None) -> T:
202
206
  for v in vs:
203
207
  if v is not None:
@@ -246,16 +250,17 @@ def new_function(
246
250
  # a tuple that supplies the bindings for free variables
247
251
  closure: tuple | None = None,
248
252
 
249
- # # a dictionary that specifies the default keyword argument values
250
- # kwdefaults: dict | None = None,
253
+ # a dictionary that specifies the default keyword argument values
254
+ kwdefaults: dict | None = None,
251
255
  ) -> types.FunctionType:
256
+ # https://github.com/python/cpython/blob/9c8eade20c6c6cc6f31dffb5e42472391d63bbf4/Objects/funcobject.c#L909
252
257
  return types.FunctionType(
253
258
  code=code,
254
259
  globals=globals,
255
260
  name=name,
256
261
  argdefs=argdefs,
257
262
  closure=closure,
258
- # kwdefaults=kwdefaults,
263
+ kwdefaults=kwdefaults,
259
264
  )
260
265
 
261
266
 
@@ -266,5 +271,9 @@ def new_function_kwargs(f: types.FunctionType) -> dict[str, ta.Any]:
266
271
  name=f.__name__,
267
272
  argdefs=f.__defaults__,
268
273
  closure=f.__closure__,
269
- # kwdefaults=f.__kwdefaults__,
274
+ kwdefaults=f.__kwdefaults__,
270
275
  )
276
+
277
+
278
+ def copy_function(f: types.FunctionType) -> types.FunctionType:
279
+ return new_function(**new_function_kwargs(f))
@@ -5,10 +5,13 @@
5
5
  #define Py_BUILD_CORE 1
6
6
  #include "Python.h"
7
7
  #include "internal/pycore_frame.h"
8
+ #if PY_VERSION_HEX >= 0x030E0000
9
+ #include "internal/pycore_interpframe.h"
10
+ #endif
8
11
  #undef Py_BUILD_CORE
9
12
 
10
13
  #if PY_VERSION_HEX < 0x030D0000
11
- # error "This extension requires CPython 3.13+"
14
+ #error "This extension requires CPython 3.13+"
12
15
  #endif
13
16
 
14
17
  //
@@ -50,14 +53,12 @@ _set_frame_builtins(PyObject *self, PyObject *args)
50
53
 
51
54
  std::atomic_ref<PyObject*> builtins_ref(iframe->f_builtins);
52
55
  PyObject* expected = old_builtins;
53
- bool success = builtins_ref.compare_exchange_strong(
56
+ if (builtins_ref.compare_exchange_strong(
54
57
  expected,
55
58
  new_builtins,
56
59
  std::memory_order_acq_rel,
57
60
  std::memory_order_acquire
58
- );
59
-
60
- if (success) {
61
+ )) {
61
62
  Py_RETURN_TRUE;
62
63
  } else {
63
64
  Py_RETURN_FALSE;
@@ -73,13 +74,13 @@ static PyMethodDef capture_methods[] = {
73
74
  {NULL, NULL, 0, NULL}
74
75
  };
75
76
 
76
- static struct PyModuleDef_Slot capture_slots[] = {
77
+ static PyModuleDef_Slot capture_slots[] = {
77
78
  {Py_mod_gil, Py_MOD_GIL_NOT_USED},
78
- {Py_mod_multiple_interpreters, Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED},
79
+ {Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED},
79
80
  {0, NULL}
80
81
  };
81
82
 
82
- static struct PyModuleDef capture_module = {
83
+ static PyModuleDef capture_module = {
83
84
  .m_base = PyModuleDef_HEAD_INIT,
84
85
  .m_name = _MODULE_NAME,
85
86
  .m_doc = capture_doc,
@@ -93,7 +94,8 @@ static struct PyModuleDef capture_module = {
93
94
 
94
95
  extern "C" {
95
96
 
96
- PyMODINIT_FUNC PyInit__capture(void)
97
+ PyMODINIT_FUNC
98
+ PyInit__capture(void)
97
99
  {
98
100
  return PyModuleDef_Init(&capture_module);
99
101
  }