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.
- omlish/.omlish-manifests.json +12 -0
- omlish/__about__.py +15 -15
- omlish/argparse/all.py +17 -9
- omlish/argparse/cli.py +16 -3
- omlish/argparse/utils.py +21 -0
- omlish/asyncs/asyncio/rlock.py +110 -0
- omlish/asyncs/asyncio/sync.py +43 -0
- omlish/asyncs/asyncio/utils.py +2 -0
- omlish/asyncs/sync.py +25 -0
- omlish/bootstrap/_marshal.py +1 -1
- omlish/bootstrap/diag.py +12 -21
- omlish/bootstrap/main.py +2 -5
- omlish/bootstrap/sys.py +27 -28
- omlish/cexts/__init__.py +0 -0
- omlish/cexts/include/omlish/omlish.hh +1 -0
- omlish/collections/__init__.py +13 -1
- omlish/collections/attrregistry.py +210 -0
- omlish/collections/cache/impl.py +1 -0
- omlish/collections/identity.py +1 -0
- omlish/collections/mappings.py +28 -0
- omlish/collections/trie.py +5 -1
- omlish/collections/utils.py +77 -0
- omlish/concurrent/all.py +2 -1
- omlish/concurrent/futures.py +25 -0
- omlish/concurrent/threadlets.py +1 -1
- omlish/daemons/reparent.py +2 -3
- omlish/daemons/spawning.py +2 -3
- omlish/dataclasses/__init__.py +2 -0
- omlish/dataclasses/impl/api/classes/decorator.py +3 -0
- omlish/dataclasses/impl/api/classes/make.py +3 -0
- omlish/dataclasses/impl/concerns/repr.py +15 -2
- omlish/dataclasses/impl/configs.py +97 -37
- omlish/dataclasses/impl/generation/compilation.py +21 -19
- omlish/dataclasses/impl/generation/globals.py +1 -0
- omlish/dataclasses/impl/generation/ops.py +1 -0
- omlish/dataclasses/impl/generation/processor.py +105 -24
- omlish/dataclasses/impl/processing/base.py +8 -0
- omlish/dataclasses/impl/processing/driving.py +8 -8
- omlish/dataclasses/specs.py +1 -0
- omlish/dataclasses/tools/modifiers.py +5 -0
- omlish/diag/cmds/__init__.py +0 -0
- omlish/diag/{lslocks.py → cmds/lslocks.py} +6 -6
- omlish/diag/{lsof.py → cmds/lsof.py} +6 -6
- omlish/diag/{ps.py → cmds/ps.py} +6 -6
- omlish/diag/pycharm.py +16 -2
- omlish/diag/pydevd.py +58 -40
- omlish/diag/replserver/console.py +1 -1
- omlish/dispatch/__init__.py +18 -12
- omlish/dispatch/methods.py +50 -140
- omlish/dom/rendering.py +1 -1
- omlish/formats/dotenv.py +1 -1
- omlish/formats/json/stream/__init__.py +13 -0
- omlish/funcs/guard.py +225 -0
- omlish/graphs/dot/rendering.py +1 -1
- omlish/http/all.py +44 -4
- omlish/http/clients/asyncs.py +33 -27
- omlish/http/clients/base.py +17 -1
- omlish/http/clients/coro/__init__.py +0 -0
- omlish/http/clients/coro/sync.py +171 -0
- omlish/http/clients/default.py +208 -29
- omlish/http/clients/executor.py +56 -0
- omlish/http/clients/httpx.py +72 -11
- omlish/http/clients/middleware.py +181 -0
- omlish/http/clients/sync.py +33 -27
- omlish/http/clients/syncasync.py +49 -0
- omlish/http/clients/urllib.py +6 -3
- omlish/http/coro/client/connection.py +15 -6
- omlish/http/coro/io.py +2 -0
- omlish/http/flasky/__init__.py +40 -0
- omlish/http/flasky/_compat.py +2 -0
- omlish/http/flasky/api.py +82 -0
- omlish/http/flasky/app.py +203 -0
- omlish/http/flasky/cvs.py +59 -0
- omlish/http/flasky/requests.py +20 -0
- omlish/http/flasky/responses.py +23 -0
- omlish/http/flasky/routes.py +23 -0
- omlish/http/flasky/types.py +15 -0
- omlish/http/urls.py +67 -0
- omlish/inject/__init__.py +38 -18
- omlish/inject/_dataclasses.py +4986 -0
- omlish/inject/binder.py +4 -48
- omlish/inject/elements.py +27 -0
- omlish/inject/helpers/__init__.py +0 -0
- omlish/inject/{utils.py → helpers/constfn.py} +3 -3
- omlish/inject/{tags.py → helpers/id.py} +2 -2
- omlish/inject/helpers/multis.py +143 -0
- omlish/inject/helpers/wrappers.py +54 -0
- omlish/inject/impl/elements.py +47 -17
- omlish/inject/impl/injector.py +20 -19
- omlish/inject/impl/inspect.py +10 -1
- omlish/inject/impl/maysync.py +3 -4
- omlish/inject/impl/multis.py +3 -0
- omlish/inject/impl/sync.py +3 -4
- omlish/inject/injector.py +31 -2
- omlish/inject/inspect.py +35 -0
- omlish/inject/maysync.py +2 -4
- omlish/inject/multis.py +8 -0
- omlish/inject/overrides.py +3 -3
- omlish/inject/privates.py +6 -0
- omlish/inject/providers.py +3 -2
- omlish/inject/sync.py +5 -4
- omlish/io/buffers.py +118 -0
- omlish/io/readers.py +29 -0
- omlish/iterators/transforms.py +2 -2
- omlish/lang/__init__.py +178 -97
- omlish/lang/_asyncs.cc +186 -0
- omlish/lang/asyncs.py +17 -0
- omlish/lang/casing.py +11 -0
- omlish/lang/contextmanagers.py +28 -4
- omlish/lang/functions.py +31 -22
- omlish/lang/imports/_capture.cc +11 -9
- omlish/lang/imports/capture.py +363 -170
- omlish/lang/imports/proxy.py +455 -152
- omlish/lang/lazyglobals.py +22 -9
- omlish/lang/params.py +17 -0
- omlish/lang/recursion.py +0 -1
- omlish/lang/sequences.py +124 -0
- omlish/lite/abstract.py +54 -24
- omlish/lite/asyncs.py +2 -2
- omlish/lite/attrops.py +2 -0
- omlish/lite/contextmanagers.py +4 -4
- omlish/lite/dataclasses.py +44 -0
- omlish/lite/maybes.py +8 -0
- omlish/lite/maysync.py +1 -5
- omlish/lite/pycharm.py +1 -1
- omlish/lite/typing.py +6 -0
- omlish/logs/all.py +1 -1
- omlish/logs/utils.py +1 -1
- omlish/manifests/loading.py +2 -1
- omlish/marshal/__init__.py +33 -13
- omlish/marshal/_dataclasses.py +2774 -0
- omlish/marshal/base/configs.py +12 -0
- omlish/marshal/base/contexts.py +36 -21
- omlish/marshal/base/funcs.py +8 -11
- omlish/marshal/base/options.py +8 -0
- omlish/marshal/base/registries.py +146 -44
- omlish/marshal/base/types.py +40 -16
- omlish/marshal/composite/iterables.py +33 -20
- omlish/marshal/composite/literals.py +20 -18
- omlish/marshal/composite/mappings.py +36 -23
- omlish/marshal/composite/maybes.py +29 -19
- omlish/marshal/composite/newtypes.py +16 -16
- omlish/marshal/composite/optionals.py +14 -14
- omlish/marshal/composite/special.py +15 -15
- omlish/marshal/composite/unions/__init__.py +0 -0
- omlish/marshal/composite/unions/literals.py +93 -0
- omlish/marshal/composite/unions/primitives.py +103 -0
- omlish/marshal/factories/invalidate.py +18 -68
- omlish/marshal/factories/method.py +26 -0
- omlish/marshal/factories/moduleimport/factories.py +22 -65
- omlish/marshal/factories/multi.py +13 -25
- omlish/marshal/factories/recursive.py +42 -56
- omlish/marshal/factories/typecache.py +29 -74
- omlish/marshal/factories/typemap.py +42 -43
- omlish/marshal/objects/dataclasses.py +129 -106
- omlish/marshal/objects/marshal.py +18 -14
- omlish/marshal/objects/namedtuples.py +48 -42
- omlish/marshal/objects/unmarshal.py +19 -15
- omlish/marshal/polymorphism/marshal.py +9 -11
- omlish/marshal/polymorphism/metadata.py +16 -5
- omlish/marshal/polymorphism/standard.py +13 -1
- omlish/marshal/polymorphism/unions.py +15 -105
- omlish/marshal/polymorphism/unmarshal.py +9 -10
- omlish/marshal/singular/enums.py +14 -18
- omlish/marshal/standard.py +10 -6
- omlish/marshal/trivial/any.py +1 -1
- omlish/marshal/trivial/forbidden.py +21 -26
- omlish/metadata.py +23 -1
- omlish/os/forkhooks.py +4 -0
- omlish/os/pidfiles/pinning.py +2 -2
- omlish/reflect/types.py +1 -0
- omlish/secrets/marshal.py +1 -1
- omlish/specs/jmespath/__init__.py +12 -3
- omlish/specs/jmespath/_dataclasses.py +2893 -0
- omlish/specs/jmespath/ast.py +1 -1
- omlish/specs/jsonrpc/__init__.py +13 -0
- omlish/specs/jsonrpc/_marshal.py +32 -23
- omlish/specs/jsonrpc/conns.py +10 -7
- omlish/specs/jsonschema/_marshal.py +1 -1
- omlish/specs/jsonschema/keywords/__init__.py +7 -0
- omlish/specs/jsonschema/keywords/_dataclasses.py +1644 -0
- omlish/specs/openapi/_marshal.py +31 -22
- omlish/sql/{tabledefs/alchemy.py → alchemy/tabledefs.py} +2 -2
- omlish/sql/queries/_marshal.py +2 -2
- omlish/sql/queries/rendering.py +1 -1
- omlish/sql/tabledefs/_marshal.py +1 -1
- omlish/subprocesses/base.py +4 -0
- omlish/subprocesses/editor.py +1 -1
- omlish/sync.py +155 -21
- omlish/term/alt.py +60 -0
- omlish/term/confirm.py +8 -8
- omlish/term/pager.py +235 -0
- omlish/term/terminfo.py +935 -0
- omlish/term/termstate.py +67 -0
- omlish/term/vt100/terminal.py +0 -3
- omlish/testing/pytest/plugins/asyncs/fixtures.py +4 -1
- omlish/testing/pytest/plugins/skips.py +2 -1
- omlish/testing/unittest/main.py +3 -3
- omlish/text/docwrap/__init__.py +3 -0
- omlish/text/docwrap/__main__.py +11 -0
- omlish/text/docwrap/api.py +83 -0
- omlish/text/docwrap/cli.py +86 -0
- omlish/text/docwrap/groups.py +84 -0
- omlish/text/docwrap/lists.py +167 -0
- omlish/text/docwrap/parts.py +146 -0
- omlish/text/docwrap/reflowing.py +106 -0
- omlish/text/docwrap/rendering.py +151 -0
- omlish/text/docwrap/utils.py +11 -0
- omlish/text/docwrap/wrapping.py +59 -0
- omlish/text/filecache.py +2 -2
- omlish/text/lorem.py +6 -0
- omlish/text/parts.py +2 -2
- omlish/text/textwrap.py +51 -0
- omlish/typedvalues/marshal.py +85 -59
- omlish/typedvalues/values.py +2 -1
- {omlish-0.0.0.dev447.dist-info → omlish-0.0.0.dev484.dist-info}/METADATA +29 -28
- {omlish-0.0.0.dev447.dist-info → omlish-0.0.0.dev484.dist-info}/RECORD +222 -171
- omlish/dataclasses/impl/generation/mangling.py +0 -18
- omlish/funcs/match.py +0 -227
- omlish/marshal/factories/match.py +0 -34
- omlish/marshal/factories/simple.py +0 -28
- /omlish/inject/impl/{providers2.py → providersmap.py} +0 -0
- {omlish-0.0.0.dev447.dist-info → omlish-0.0.0.dev484.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev447.dist-info → omlish-0.0.0.dev484.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev447.dist-info → omlish-0.0.0.dev484.dist-info}/licenses/LICENSE +0 -0
- {omlish-0.0.0.dev447.dist-info → omlish-0.0.0.dev484.dist-info}/top_level.txt +0 -0
omlish/lang/contextmanagers.py
CHANGED
|
@@ -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:
|
|
398
|
-
**kwargs:
|
|
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:
|
|
407
|
-
**kwargs:
|
|
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
|
|
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
|
-
#
|
|
250
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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))
|
omlish/lang/imports/_capture.cc
CHANGED
|
@@ -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
|
-
#
|
|
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
|
-
|
|
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
|
|
77
|
+
static PyModuleDef_Slot capture_slots[] = {
|
|
77
78
|
{Py_mod_gil, Py_MOD_GIL_NOT_USED},
|
|
78
|
-
{Py_mod_multiple_interpreters,
|
|
79
|
+
{Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED},
|
|
79
80
|
{0, NULL}
|
|
80
81
|
};
|
|
81
82
|
|
|
82
|
-
static
|
|
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
|
|
97
|
+
PyMODINIT_FUNC
|
|
98
|
+
PyInit__capture(void)
|
|
97
99
|
{
|
|
98
100
|
return PyModuleDef_Init(&capture_module);
|
|
99
101
|
}
|