omlish 0.0.0.dev447__py3-none-any.whl → 0.0.0.dev493__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 (265) hide show
  1. omlish/.omlish-manifests.json +12 -0
  2. omlish/README.md +199 -0
  3. omlish/__about__.py +21 -16
  4. omlish/argparse/all.py +17 -9
  5. omlish/argparse/cli.py +16 -3
  6. omlish/argparse/utils.py +21 -0
  7. omlish/asyncs/asyncio/rlock.py +110 -0
  8. omlish/asyncs/asyncio/sync.py +43 -0
  9. omlish/asyncs/asyncio/utils.py +2 -0
  10. omlish/asyncs/sync.py +25 -0
  11. omlish/bootstrap/_marshal.py +1 -1
  12. omlish/bootstrap/diag.py +12 -21
  13. omlish/bootstrap/main.py +2 -5
  14. omlish/bootstrap/sys.py +27 -28
  15. omlish/cexts/__init__.py +0 -0
  16. omlish/cexts/include/omlish/omlish.hh +1 -0
  17. omlish/collections/__init__.py +13 -1
  18. omlish/collections/attrregistry.py +210 -0
  19. omlish/collections/cache/impl.py +1 -0
  20. omlish/collections/identity.py +1 -0
  21. omlish/collections/mappings.py +28 -0
  22. omlish/collections/trie.py +5 -1
  23. omlish/collections/utils.py +77 -0
  24. omlish/concurrent/all.py +2 -1
  25. omlish/concurrent/futures.py +25 -0
  26. omlish/concurrent/threadlets.py +1 -1
  27. omlish/daemons/reparent.py +2 -3
  28. omlish/daemons/spawning.py +2 -3
  29. omlish/dataclasses/__init__.py +2 -0
  30. omlish/dataclasses/impl/api/classes/decorator.py +3 -0
  31. omlish/dataclasses/impl/api/classes/make.py +3 -0
  32. omlish/dataclasses/impl/concerns/repr.py +15 -2
  33. omlish/dataclasses/impl/configs.py +97 -37
  34. omlish/dataclasses/impl/generation/compilation.py +21 -19
  35. omlish/dataclasses/impl/generation/globals.py +1 -0
  36. omlish/dataclasses/impl/generation/ops.py +1 -0
  37. omlish/dataclasses/impl/generation/plans.py +2 -17
  38. omlish/dataclasses/impl/generation/processor.py +106 -25
  39. omlish/dataclasses/impl/processing/base.py +8 -0
  40. omlish/dataclasses/impl/processing/driving.py +19 -7
  41. omlish/dataclasses/specs.py +1 -0
  42. omlish/dataclasses/tools/modifiers.py +5 -0
  43. omlish/diag/_pycharm/runhack.py +1 -1
  44. omlish/diag/cmds/__init__.py +0 -0
  45. omlish/diag/{lslocks.py → cmds/lslocks.py} +6 -6
  46. omlish/diag/{lsof.py → cmds/lsof.py} +6 -6
  47. omlish/diag/{ps.py → cmds/ps.py} +6 -6
  48. omlish/diag/pycharm.py +16 -2
  49. omlish/diag/pydevd.py +58 -40
  50. omlish/diag/replserver/console.py +1 -1
  51. omlish/dispatch/__init__.py +18 -12
  52. omlish/dispatch/methods.py +50 -140
  53. omlish/dom/rendering.py +1 -1
  54. omlish/formats/dotenv.py +1 -1
  55. omlish/formats/json/stream/__init__.py +13 -0
  56. omlish/funcs/guard.py +225 -0
  57. omlish/graphs/dot/rendering.py +1 -1
  58. omlish/http/all.py +44 -4
  59. omlish/http/clients/asyncs.py +33 -27
  60. omlish/http/clients/base.py +17 -1
  61. omlish/http/clients/coro/__init__.py +0 -0
  62. omlish/http/clients/coro/sync.py +171 -0
  63. omlish/http/clients/default.py +208 -29
  64. omlish/http/clients/executor.py +56 -0
  65. omlish/http/clients/httpx.py +72 -11
  66. omlish/http/clients/middleware.py +181 -0
  67. omlish/http/clients/sync.py +33 -27
  68. omlish/http/clients/syncasync.py +49 -0
  69. omlish/http/clients/urllib.py +6 -3
  70. omlish/http/coro/client/connection.py +15 -6
  71. omlish/http/coro/io.py +2 -0
  72. omlish/http/flasky/__init__.py +40 -0
  73. omlish/http/flasky/_compat.py +2 -0
  74. omlish/http/flasky/api.py +82 -0
  75. omlish/http/flasky/app.py +203 -0
  76. omlish/http/flasky/cvs.py +59 -0
  77. omlish/http/flasky/requests.py +20 -0
  78. omlish/http/flasky/responses.py +23 -0
  79. omlish/http/flasky/routes.py +23 -0
  80. omlish/http/flasky/types.py +15 -0
  81. omlish/http/urls.py +67 -0
  82. omlish/inject/__init__.py +57 -29
  83. omlish/inject/_dataclasses.py +5148 -0
  84. omlish/inject/binder.py +11 -52
  85. omlish/inject/eagers.py +2 -0
  86. omlish/inject/elements.py +27 -0
  87. omlish/inject/helpers/__init__.py +0 -0
  88. omlish/inject/{utils.py → helpers/constfn.py} +3 -3
  89. omlish/inject/{tags.py → helpers/id.py} +2 -2
  90. omlish/inject/helpers/late.py +76 -0
  91. omlish/inject/{managed.py → helpers/managed.py} +10 -10
  92. omlish/inject/helpers/multis.py +143 -0
  93. omlish/inject/helpers/wrappers.py +54 -0
  94. omlish/inject/impl/elements.py +54 -21
  95. omlish/inject/impl/injector.py +29 -25
  96. omlish/inject/impl/inspect.py +10 -1
  97. omlish/inject/impl/maysync.py +3 -4
  98. omlish/inject/impl/multis.py +3 -0
  99. omlish/inject/impl/sync.py +3 -4
  100. omlish/inject/injector.py +31 -2
  101. omlish/inject/inspect.py +35 -0
  102. omlish/inject/maysync.py +2 -4
  103. omlish/inject/multis.py +8 -0
  104. omlish/inject/overrides.py +3 -3
  105. omlish/inject/privates.py +6 -0
  106. omlish/inject/providers.py +3 -2
  107. omlish/inject/sync.py +5 -4
  108. omlish/io/buffers.py +118 -0
  109. omlish/io/readers.py +29 -0
  110. omlish/iterators/transforms.py +2 -2
  111. omlish/lang/__init__.py +180 -97
  112. omlish/lang/_asyncs.cc +186 -0
  113. omlish/lang/asyncs.py +17 -0
  114. omlish/lang/casing.py +11 -0
  115. omlish/lang/contextmanagers.py +28 -4
  116. omlish/lang/functions.py +31 -22
  117. omlish/lang/imports/_capture.cc +11 -9
  118. omlish/lang/imports/capture.py +363 -170
  119. omlish/lang/imports/proxy.py +455 -152
  120. omlish/lang/lazyglobals.py +22 -9
  121. omlish/lang/params.py +17 -0
  122. omlish/lang/recursion.py +0 -1
  123. omlish/lang/sequences.py +124 -0
  124. omlish/lifecycles/README.md +30 -0
  125. omlish/lifecycles/__init__.py +87 -13
  126. omlish/lifecycles/_dataclasses.py +1388 -0
  127. omlish/lifecycles/base.py +178 -64
  128. omlish/lifecycles/contextmanagers.py +113 -4
  129. omlish/lifecycles/controller.py +150 -87
  130. omlish/lifecycles/injection.py +143 -0
  131. omlish/lifecycles/listeners.py +56 -0
  132. omlish/lifecycles/managed.py +142 -0
  133. omlish/lifecycles/manager.py +218 -93
  134. omlish/lifecycles/states.py +2 -0
  135. omlish/lifecycles/transitions.py +3 -0
  136. omlish/lifecycles/unwrap.py +57 -0
  137. omlish/lite/abstract.py +54 -24
  138. omlish/lite/asyncs.py +2 -2
  139. omlish/lite/attrops.py +2 -0
  140. omlish/lite/contextmanagers.py +4 -4
  141. omlish/lite/dataclasses.py +44 -0
  142. omlish/lite/maybes.py +8 -0
  143. omlish/lite/maysync.py +1 -5
  144. omlish/lite/pycharm.py +1 -1
  145. omlish/lite/typing.py +24 -0
  146. omlish/logs/_amalg.py +1 -1
  147. omlish/logs/all.py +25 -11
  148. omlish/logs/asyncs.py +73 -0
  149. omlish/logs/base.py +101 -12
  150. omlish/logs/contexts.py +4 -1
  151. omlish/logs/lists.py +125 -0
  152. omlish/logs/modules.py +19 -1
  153. omlish/logs/std/loggers.py +6 -1
  154. omlish/logs/std/noisy.py +11 -9
  155. omlish/logs/{standard.py → std/standard.py} +3 -4
  156. omlish/logs/utils.py +17 -2
  157. omlish/manifests/loading.py +2 -1
  158. omlish/marshal/__init__.py +33 -13
  159. omlish/marshal/_dataclasses.py +2774 -0
  160. omlish/marshal/base/configs.py +12 -0
  161. omlish/marshal/base/contexts.py +36 -21
  162. omlish/marshal/base/funcs.py +8 -11
  163. omlish/marshal/base/options.py +8 -0
  164. omlish/marshal/base/registries.py +146 -44
  165. omlish/marshal/base/types.py +40 -16
  166. omlish/marshal/composite/iterables.py +33 -20
  167. omlish/marshal/composite/literals.py +20 -18
  168. omlish/marshal/composite/mappings.py +36 -23
  169. omlish/marshal/composite/maybes.py +29 -19
  170. omlish/marshal/composite/newtypes.py +16 -16
  171. omlish/marshal/composite/optionals.py +14 -14
  172. omlish/marshal/composite/special.py +15 -15
  173. omlish/marshal/composite/unions/__init__.py +0 -0
  174. omlish/marshal/composite/unions/literals.py +93 -0
  175. omlish/marshal/composite/unions/primitives.py +103 -0
  176. omlish/marshal/factories/invalidate.py +18 -68
  177. omlish/marshal/factories/method.py +26 -0
  178. omlish/marshal/factories/moduleimport/factories.py +22 -65
  179. omlish/marshal/factories/multi.py +13 -25
  180. omlish/marshal/factories/recursive.py +42 -56
  181. omlish/marshal/factories/typecache.py +29 -74
  182. omlish/marshal/factories/typemap.py +42 -43
  183. omlish/marshal/objects/dataclasses.py +129 -106
  184. omlish/marshal/objects/marshal.py +18 -14
  185. omlish/marshal/objects/namedtuples.py +48 -42
  186. omlish/marshal/objects/unmarshal.py +19 -15
  187. omlish/marshal/polymorphism/marshal.py +9 -11
  188. omlish/marshal/polymorphism/metadata.py +16 -5
  189. omlish/marshal/polymorphism/standard.py +13 -1
  190. omlish/marshal/polymorphism/unions.py +15 -105
  191. omlish/marshal/polymorphism/unmarshal.py +9 -10
  192. omlish/marshal/singular/enums.py +14 -18
  193. omlish/marshal/standard.py +10 -6
  194. omlish/marshal/trivial/any.py +1 -1
  195. omlish/marshal/trivial/forbidden.py +21 -26
  196. omlish/metadata.py +23 -1
  197. omlish/os/forkhooks.py +4 -0
  198. omlish/os/pidfiles/pinning.py +2 -2
  199. omlish/reflect/__init__.py +43 -26
  200. omlish/reflect/ops.py +10 -1
  201. omlish/reflect/types.py +1 -0
  202. omlish/secrets/marshal.py +1 -1
  203. omlish/specs/jmespath/__init__.py +12 -3
  204. omlish/specs/jmespath/_dataclasses.py +2893 -0
  205. omlish/specs/jmespath/ast.py +1 -1
  206. omlish/specs/jsonrpc/__init__.py +13 -0
  207. omlish/specs/jsonrpc/_marshal.py +32 -23
  208. omlish/specs/jsonrpc/conns.py +10 -7
  209. omlish/specs/jsonschema/_marshal.py +1 -1
  210. omlish/specs/jsonschema/keywords/__init__.py +7 -0
  211. omlish/specs/jsonschema/keywords/_dataclasses.py +1644 -0
  212. omlish/specs/openapi/_marshal.py +31 -22
  213. omlish/sql/__init__.py +24 -5
  214. omlish/sql/{tabledefs/alchemy.py → alchemy/tabledefs.py} +2 -2
  215. omlish/sql/api/dbapi.py +1 -1
  216. omlish/sql/dbapi/__init__.py +15 -0
  217. omlish/sql/{dbapi.py → dbapi/drivers.py} +2 -2
  218. omlish/sql/queries/__init__.py +3 -0
  219. omlish/sql/queries/_marshal.py +2 -2
  220. omlish/sql/queries/rendering.py +1 -1
  221. omlish/sql/tabledefs/_marshal.py +1 -1
  222. omlish/subprocesses/base.py +4 -0
  223. omlish/subprocesses/editor.py +1 -1
  224. omlish/sync.py +155 -21
  225. omlish/term/alt.py +60 -0
  226. omlish/term/confirm.py +8 -8
  227. omlish/term/pager.py +235 -0
  228. omlish/term/terminfo.py +935 -0
  229. omlish/term/termstate.py +67 -0
  230. omlish/term/vt100/terminal.py +0 -3
  231. omlish/testing/pytest/plugins/asyncs/fixtures.py +4 -1
  232. omlish/testing/pytest/plugins/asyncs/plugin.py +2 -0
  233. omlish/testing/pytest/plugins/skips.py +2 -1
  234. omlish/testing/unittest/main.py +3 -3
  235. omlish/text/docwrap/__init__.py +3 -0
  236. omlish/text/docwrap/__main__.py +11 -0
  237. omlish/text/docwrap/api.py +83 -0
  238. omlish/text/docwrap/cli.py +91 -0
  239. omlish/text/docwrap/groups.py +84 -0
  240. omlish/text/docwrap/lists.py +167 -0
  241. omlish/text/docwrap/parts.py +146 -0
  242. omlish/text/docwrap/reflowing.py +106 -0
  243. omlish/text/docwrap/rendering.py +151 -0
  244. omlish/text/docwrap/utils.py +11 -0
  245. omlish/text/docwrap/wrapping.py +59 -0
  246. omlish/text/filecache.py +2 -2
  247. omlish/text/lorem.py +6 -0
  248. omlish/text/parts.py +2 -2
  249. omlish/text/textwrap.py +51 -0
  250. omlish/typedvalues/marshal.py +85 -59
  251. omlish/typedvalues/values.py +2 -1
  252. {omlish-0.0.0.dev447.dist-info → omlish-0.0.0.dev493.dist-info}/METADATA +36 -32
  253. {omlish-0.0.0.dev447.dist-info → omlish-0.0.0.dev493.dist-info}/RECORD +260 -199
  254. omlish/dataclasses/impl/generation/mangling.py +0 -18
  255. omlish/funcs/match.py +0 -227
  256. omlish/lifecycles/abstract.py +0 -86
  257. omlish/marshal/factories/match.py +0 -34
  258. omlish/marshal/factories/simple.py +0 -28
  259. /omlish/inject/{impl → helpers}/proxy.py +0 -0
  260. /omlish/inject/impl/{providers2.py → providersmap.py} +0 -0
  261. /omlish/sql/{abc.py → dbapi/abc.py} +0 -0
  262. {omlish-0.0.0.dev447.dist-info → omlish-0.0.0.dev493.dist-info}/WHEEL +0 -0
  263. {omlish-0.0.0.dev447.dist-info → omlish-0.0.0.dev493.dist-info}/entry_points.txt +0 -0
  264. {omlish-0.0.0.dev447.dist-info → omlish-0.0.0.dev493.dist-info}/licenses/LICENSE +0 -0
  265. {omlish-0.0.0.dev447.dist-info → omlish-0.0.0.dev493.dist-info}/top_level.txt +0 -0
@@ -1,9 +1,10 @@
1
+ import typing as ta
2
+
1
3
  from .. import check
2
4
  from .. import dataclasses as dc
3
5
  from .. import lang
4
6
  from .. import marshal as msh
5
7
  from .. import reflect as rfl
6
- from ..funcs import match as mfs
7
8
  from .collection import TypedValues
8
9
  from .reflect import reflect_typed_values_impls
9
10
  from .values import ScalarTypedValue
@@ -14,60 +15,77 @@ from .values import TypedValue
14
15
 
15
16
 
16
17
  def _build_typed_value_poly(rty: rfl.Type) -> msh.Polymorphism:
17
- ty: type[TypedValue] = check.issubclass(check.isinstance(rty, type), TypedValue)
18
+ ty: type[TypedValue] = check.issubclass(check.isinstance(rty, type), TypedValue) # noqa
18
19
  check.state(lang.is_abstract_class(ty))
19
20
  return msh.polymorphism_from_subclasses(
20
21
  ty,
21
22
  naming=msh.Naming.SNAKE,
22
- strip_suffix='auto',
23
+ strip_suffix=msh.AutoStripSuffix,
23
24
  )
24
25
 
25
26
 
26
- class TypedValueMarshalerFactory(msh.MarshalerFactoryMatchClass):
27
- @mfs.simple(lambda _, ctx, rty: (
28
- isinstance(rty, type) and
29
- issubclass(rty, ScalarTypedValue) and
30
- not lang.is_abstract_class(rty)
31
- ))
32
- def _build_scalar(self, ctx: msh.MarshalContext, rty: rfl.Type) -> msh.Marshaler:
33
- dc_rfl = dc.reflect(check.isinstance(rty, type))
34
- v_rty = check.single(dc_rfl.fields_inspection.generic_replaced_field_annotations.values())
35
- v_m = ctx.make(v_rty)
36
- return msh.WrappedMarshaler(lambda _, o: o.v, v_m)
37
-
38
- @mfs.simple(lambda _, ctx, rty: (
39
- isinstance(rty, type) and
40
- issubclass(rty, TypedValue) and
41
- lang.is_abstract_class(rty)
42
- ))
43
- def _build_abstract(self, ctx: msh.MarshalContext, rty: rfl.Type) -> msh.Marshaler:
44
- return msh.make_polymorphism_marshaler(
27
+ class TypedValueMarshalerFactory(msh.MarshalerFactoryMethodClass):
28
+ @msh.MarshalerFactoryMethodClass.make_marshaler.register
29
+ def _make_scalar(self, ctx: msh.MarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], msh.Marshaler] | None:
30
+ if not (
31
+ isinstance(rty, type) and
32
+ issubclass(rty, ScalarTypedValue) and
33
+ not lang.is_abstract_class(rty)
34
+ ):
35
+ return None
36
+
37
+ def inner() -> msh.Marshaler:
38
+ dc_rfl = dc.reflect(check.isinstance(rty, type))
39
+ v_rty = check.single(dc_rfl.fields_inspection.generic_replaced_field_annotations.values())
40
+ v_m = ctx.make_marshaler(v_rty)
41
+ return msh.WrappedMarshaler(lambda _, o: o.v, v_m)
42
+
43
+ return inner
44
+
45
+ @msh.MarshalerFactoryMethodClass.make_marshaler.register
46
+ def _make_abstract(self, ctx: msh.MarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], msh.Marshaler] | None:
47
+ if not (
48
+ isinstance(rty, type) and
49
+ issubclass(rty, TypedValue) and
50
+ lang.is_abstract_class(rty)
51
+ ):
52
+ return None
53
+
54
+ return lambda: msh.make_polymorphism_marshaler(
45
55
  _build_typed_value_poly(rty).impls,
46
56
  msh.WrapperTypeTagging(),
47
57
  ctx,
48
58
  )
49
59
 
50
60
 
51
- class TypedValueUnmarshalerFactory(msh.UnmarshalerFactoryMatchClass):
52
- @mfs.simple(lambda _, ctx, rty: (
53
- isinstance(rty, type) and
54
- issubclass(rty, ScalarTypedValue) and
55
- not lang.is_abstract_class(rty)
56
- ))
57
- def _build_scalar(self, ctx: msh.UnmarshalContext, rty: rfl.Type) -> msh.Unmarshaler:
58
- rty = check.isinstance(rty, type)
59
- dc_rfl = dc.reflect(rty)
60
- v_rty = check.single(dc_rfl.fields_inspection.generic_replaced_field_annotations.values())
61
- v_u = ctx.make(v_rty)
62
- return msh.WrappedUnmarshaler(lambda _, v: rty(v), v_u)
63
-
64
- @mfs.simple(lambda _, ctx, rty: (
65
- isinstance(rty, type) and
66
- issubclass(rty, TypedValue) and
67
- lang.is_abstract_class(rty)
68
- ))
69
- def _build_abstract(self, ctx: msh.UnmarshalContext, rty: rfl.Type) -> msh.Unmarshaler:
70
- return msh.make_polymorphism_unmarshaler(
61
+ class TypedValueUnmarshalerFactory(msh.UnmarshalerFactoryMethodClass):
62
+ @msh.UnmarshalerFactoryMethodClass.make_unmarshaler.register
63
+ def _make_scalar(self, ctx: msh.UnmarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], msh.Unmarshaler] | None:
64
+ if not (
65
+ isinstance(rty, type) and
66
+ issubclass(rty, ScalarTypedValue) and
67
+ not lang.is_abstract_class(rty)
68
+ ):
69
+ return None
70
+
71
+ def inner() -> msh.Unmarshaler:
72
+ dc_rfl = dc.reflect(rty)
73
+ v_rty = check.single(dc_rfl.fields_inspection.generic_replaced_field_annotations.values())
74
+ v_u = ctx.make_unmarshaler(v_rty)
75
+ return msh.WrappedUnmarshaler(lambda _, v: rty(v), v_u)
76
+
77
+ return inner
78
+
79
+ @msh.UnmarshalerFactoryMethodClass.make_unmarshaler.register
80
+ def _make_abstract(self, ctx: msh.UnmarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], msh.Unmarshaler] | None: # noqa
81
+ if not (
82
+ isinstance(rty, type) and
83
+ issubclass(rty, TypedValue) and
84
+ lang.is_abstract_class(rty)
85
+ ):
86
+ return None
87
+
88
+ return lambda: msh.make_polymorphism_unmarshaler(
71
89
  _build_typed_value_poly(rty).impls,
72
90
  msh.WrapperTypeTagging(),
73
91
  ctx,
@@ -99,7 +117,7 @@ def _build_typed_values_impls(rty: rfl.Type) -> msh.Impls:
99
117
  #
100
118
 
101
119
 
102
- def build_typed_values_marshaler(ctx: msh.MarshalContext, rty: rfl.Type) -> msh.Marshaler:
120
+ def build_typed_values_marshaler(ctx: msh.MarshalFactoryContext, rty: rfl.Type) -> msh.Marshaler:
103
121
  tv_m = msh.make_polymorphism_marshaler(
104
122
  msh.Impls(_build_typed_values_impls(rty)),
105
123
  msh.WrapperTypeTagging(),
@@ -108,20 +126,24 @@ def build_typed_values_marshaler(ctx: msh.MarshalContext, rty: rfl.Type) -> msh.
108
126
  return msh.IterableMarshaler(tv_m)
109
127
 
110
128
 
111
- class TypedValuesMarshalerFactory(msh.MarshalerFactoryMatchClass):
112
- @mfs.simple(lambda _, ctx, rty: isinstance(rty, rfl.Generic) and rty.cls is TypedValues)
113
- def _build(self, ctx: msh.MarshalContext, rty: rfl.Type) -> msh.Marshaler:
114
- return build_typed_values_marshaler(ctx, rty)
129
+ class TypedValuesMarshalerFactory(msh.MarshalerFactoryMethodClass):
130
+ @msh.MarshalerFactoryMethodClass.make_marshaler.register
131
+ def _make_generic(self, ctx: msh.MarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], msh.Marshaler] | None:
132
+ if not (isinstance(rty, rfl.Generic) and rty.cls is TypedValues):
133
+ return None
134
+ return lambda: build_typed_values_marshaler(ctx, rty)
115
135
 
116
- @mfs.simple(lambda _, ctx, rty: rty is TypedValues)
117
- def _build_concrete(self, ctx: msh.MarshalContext, rty: rfl.Type) -> msh.Marshaler:
118
- raise NotImplementedError
136
+ @msh.MarshalerFactoryMethodClass.make_marshaler.register
137
+ def _make_concrete(self, ctx: msh.MarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], msh.Marshaler] | None:
138
+ if rty is not TypedValues:
139
+ return None
140
+ return lambda: lang.raise_(NotImplementedError)
119
141
 
120
142
 
121
143
  #
122
144
 
123
145
 
124
- def build_typed_values_unmarshaler(ctx: msh.UnmarshalContext, rty: rfl.Type) -> msh.Unmarshaler:
146
+ def build_typed_values_unmarshaler(ctx: msh.UnmarshalFactoryContext, rty: rfl.Type) -> msh.Unmarshaler:
125
147
  tv_u = msh.make_polymorphism_unmarshaler(
126
148
  msh.Impls(_build_typed_values_impls(rty)),
127
149
  msh.WrapperTypeTagging(),
@@ -130,21 +152,25 @@ def build_typed_values_unmarshaler(ctx: msh.UnmarshalContext, rty: rfl.Type) ->
130
152
  return msh.IterableUnmarshaler(lambda it: TypedValues(*it), tv_u) # noqa
131
153
 
132
154
 
133
- class TypedValuesUnmarshalerFactory(msh.UnmarshalerFactoryMatchClass):
134
- @mfs.simple(lambda _, ctx, rty: isinstance(rty, rfl.Generic) and rty.cls is TypedValues)
135
- def _build(self, ctx: msh.UnmarshalContext, rty: rfl.Type) -> msh.Unmarshaler:
136
- return build_typed_values_unmarshaler(ctx, rty)
155
+ class TypedValuesUnmarshalerFactory(msh.UnmarshalerFactoryMethodClass):
156
+ @msh.UnmarshalerFactoryMethodClass.make_unmarshaler.register
157
+ def _build(self, ctx: msh.UnmarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], msh.Unmarshaler] | None:
158
+ if not (isinstance(rty, rfl.Generic) and rty.cls is TypedValues):
159
+ return None
160
+ return lambda: build_typed_values_unmarshaler(ctx, rty)
137
161
 
138
- @mfs.simple(lambda _, ctx, rty: rty is TypedValues)
139
- def _build_concrete(self, ctx: msh.UnmarshalContext, rty: rfl.Type) -> msh.Unmarshaler:
140
- raise NotImplementedError
162
+ @msh.UnmarshalerFactoryMethodClass.make_unmarshaler.register
163
+ def _build_concrete(self, ctx: msh.UnmarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], msh.Unmarshaler] | None: # noqa
164
+ if rty is not TypedValues:
165
+ return None
166
+ return lambda: lang.raise_(NotImplementedError)
141
167
 
142
168
 
143
169
  ##
144
170
 
145
171
 
146
172
  @lang.static_init
147
- def _install_standard_marshalling() -> None:
173
+ def _install_standard_marshaling() -> None:
148
174
  msh.install_standard_factories(
149
175
  TypedValueMarshalerFactory(),
150
176
  TypedValueUnmarshalerFactory(),
@@ -11,7 +11,8 @@ T = ta.TypeVar('T')
11
11
 
12
12
 
13
13
  class TypedValue(lang.Abstract):
14
- pass
14
+ def __bool__(self) -> ta.NoReturn:
15
+ raise TypeError(f"Cannot convert {self!r} to bool - use '.v' or 'is not None'.")
15
16
 
16
17
 
17
18
  ##
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omlish
3
- Version: 0.0.0.dev447
3
+ Version: 0.0.0.dev493
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -15,15 +15,15 @@ Requires-Python: >=3.13
15
15
  Description-Content-Type: text/markdown
16
16
  License-File: LICENSE
17
17
  Provides-Extra: all
18
- Requires-Dist: anyio~=4.10; extra == "all"
18
+ Requires-Dist: anyio~=4.11; extra == "all"
19
19
  Requires-Dist: sniffio~=1.3; extra == "all"
20
- Requires-Dist: greenlet~=3.2; extra == "all"
21
- Requires-Dist: trio~=0.31; extra == "all"
20
+ Requires-Dist: greenlet~=3.3; extra == "all"
21
+ Requires-Dist: trio~=0.32; extra == "all"
22
22
  Requires-Dist: trio-asyncio~=0.15; extra == "all"
23
23
  Requires-Dist: lz4~=4.4; extra == "all"
24
24
  Requires-Dist: python-snappy~=0.7; extra == "all"
25
25
  Requires-Dist: zstandard~=0.25; python_version < "3.14" and extra == "all"
26
- Requires-Dist: brotli~=1.1; extra == "all"
26
+ Requires-Dist: brotli~=1.2; extra == "all"
27
27
  Requires-Dist: asttokens~=3.0; extra == "all"
28
28
  Requires-Dist: executing~=2.2; extra == "all"
29
29
  Requires-Dist: psutil~=7.1; extra == "all"
@@ -33,38 +33,38 @@ Requires-Dist: pyyaml~=6.0; extra == "all"
33
33
  Requires-Dist: cbor2~=5.7; extra == "all"
34
34
  Requires-Dist: cloudpickle~=3.1; extra == "all"
35
35
  Requires-Dist: httpx[http2]~=0.28; extra == "all"
36
- Requires-Dist: wrapt~=1.17; extra == "all"
37
- Requires-Dist: cryptography~=45.0; extra == "all"
36
+ Requires-Dist: wrapt~=2.0; extra == "all"
37
+ Requires-Dist: cryptography~=46.0; extra == "all"
38
38
  Requires-Dist: sqlalchemy[asyncio]~=2.0; extra == "all"
39
39
  Requires-Dist: pg8000~=1.31; extra == "all"
40
40
  Requires-Dist: pymysql~=1.1; extra == "all"
41
- Requires-Dist: aiomysql~=0.2; extra == "all"
42
- Requires-Dist: aiosqlite~=0.21; extra == "all"
43
- Requires-Dist: asyncpg~=0.30; extra == "all"
44
- Requires-Dist: apsw~=3.50; extra == "all"
41
+ Requires-Dist: aiomysql~=0.3; extra == "all"
42
+ Requires-Dist: aiosqlite~=0.22; extra == "all"
43
+ Requires-Dist: asyncpg~=0.31; extra == "all"
44
+ Requires-Dist: apsw~=3.51; extra == "all"
45
45
  Requires-Dist: sqlean.py~=3.50; extra == "all"
46
46
  Requires-Dist: duckdb~=1.4; extra == "all"
47
47
  Requires-Dist: markupsafe~=3.0; extra == "all"
48
48
  Requires-Dist: jinja2~=3.1; extra == "all"
49
- Requires-Dist: pytest~=8.4; extra == "all"
50
- Requires-Dist: anyio~=4.10; extra == "all"
49
+ Requires-Dist: pytest~=9.0; extra == "all"
50
+ Requires-Dist: anyio~=4.11; extra == "all"
51
51
  Requires-Dist: sniffio~=1.3; extra == "all"
52
52
  Requires-Dist: asttokens~=3.0; extra == "all"
53
53
  Requires-Dist: executing~=2.2; extra == "all"
54
54
  Requires-Dist: orjson~=3.11; extra == "all"
55
55
  Requires-Dist: pyyaml~=6.0; extra == "all"
56
- Requires-Dist: wrapt~=1.17; extra == "all"
56
+ Requires-Dist: wrapt~=2.0; extra == "all"
57
57
  Provides-Extra: async
58
- Requires-Dist: anyio~=4.10; extra == "async"
58
+ Requires-Dist: anyio~=4.11; extra == "async"
59
59
  Requires-Dist: sniffio~=1.3; extra == "async"
60
- Requires-Dist: greenlet~=3.2; extra == "async"
61
- Requires-Dist: trio~=0.31; extra == "async"
60
+ Requires-Dist: greenlet~=3.3; extra == "async"
61
+ Requires-Dist: trio~=0.32; extra == "async"
62
62
  Requires-Dist: trio-asyncio~=0.15; extra == "async"
63
63
  Provides-Extra: compress
64
64
  Requires-Dist: lz4~=4.4; extra == "compress"
65
65
  Requires-Dist: python-snappy~=0.7; extra == "compress"
66
66
  Requires-Dist: zstandard~=0.25; python_version < "3.14" and extra == "compress"
67
- Requires-Dist: brotli~=1.1; extra == "compress"
67
+ Requires-Dist: brotli~=1.2; extra == "compress"
68
68
  Provides-Extra: diag
69
69
  Requires-Dist: asttokens~=3.0; extra == "diag"
70
70
  Requires-Dist: executing~=2.2; extra == "diag"
@@ -78,33 +78,33 @@ Requires-Dist: cloudpickle~=3.1; extra == "formats"
78
78
  Provides-Extra: http
79
79
  Requires-Dist: httpx[http2]~=0.28; extra == "http"
80
80
  Provides-Extra: misc
81
- Requires-Dist: wrapt~=1.17; extra == "misc"
81
+ Requires-Dist: wrapt~=2.0; extra == "misc"
82
82
  Provides-Extra: secrets
83
- Requires-Dist: cryptography~=45.0; extra == "secrets"
83
+ Requires-Dist: cryptography~=46.0; extra == "secrets"
84
84
  Provides-Extra: sqlalchemy
85
85
  Requires-Dist: sqlalchemy[asyncio]~=2.0; extra == "sqlalchemy"
86
86
  Provides-Extra: sqldrivers
87
87
  Requires-Dist: pg8000~=1.31; extra == "sqldrivers"
88
88
  Requires-Dist: pymysql~=1.1; extra == "sqldrivers"
89
- Requires-Dist: aiomysql~=0.2; extra == "sqldrivers"
90
- Requires-Dist: aiosqlite~=0.21; extra == "sqldrivers"
91
- Requires-Dist: asyncpg~=0.30; extra == "sqldrivers"
92
- Requires-Dist: apsw~=3.50; extra == "sqldrivers"
89
+ Requires-Dist: aiomysql~=0.3; extra == "sqldrivers"
90
+ Requires-Dist: aiosqlite~=0.22; extra == "sqldrivers"
91
+ Requires-Dist: asyncpg~=0.31; extra == "sqldrivers"
92
+ Requires-Dist: apsw~=3.51; extra == "sqldrivers"
93
93
  Requires-Dist: sqlean.py~=3.50; extra == "sqldrivers"
94
94
  Requires-Dist: duckdb~=1.4; extra == "sqldrivers"
95
95
  Provides-Extra: templates
96
96
  Requires-Dist: markupsafe~=3.0; extra == "templates"
97
97
  Requires-Dist: jinja2~=3.1; extra == "templates"
98
98
  Provides-Extra: testing
99
- Requires-Dist: pytest~=8.4; extra == "testing"
99
+ Requires-Dist: pytest~=9.0; extra == "testing"
100
100
  Provides-Extra: plus
101
- Requires-Dist: anyio~=4.10; extra == "plus"
101
+ Requires-Dist: anyio~=4.11; extra == "plus"
102
102
  Requires-Dist: sniffio~=1.3; extra == "plus"
103
103
  Requires-Dist: asttokens~=3.0; extra == "plus"
104
104
  Requires-Dist: executing~=2.2; extra == "plus"
105
105
  Requires-Dist: orjson~=3.11; extra == "plus"
106
106
  Requires-Dist: pyyaml~=6.0; extra == "plus"
107
- Requires-Dist: wrapt~=1.17; extra == "plus"
107
+ Requires-Dist: wrapt~=2.0; extra == "plus"
108
108
  Dynamic: license-file
109
109
 
110
110
  # Overview
@@ -167,7 +167,7 @@ dependencies of any kind**.
167
167
  - An optional [metaclass](https://github.com/wrmsr/omlish/blob/master/omlish/dataclasses/metaclass) which removes the
168
168
  need for re-decorating subclasses (with support for inheritance of dataclass parameters like `frozen`), and some
169
169
  basic [base classes](https://github.com/wrmsr/omlish/blob/master/omlish/dataclasses/metaclass/bases.py).
170
- - (Nearly finished) support for ahead-of-time / build-time code generation, greatly reducing import times.
170
+ - Support for ahead-of-time / build-time code generation, significantly reducing import times.
171
171
 
172
172
  The stdlib-equivalent api is exported in such a way as to appear to be direct aliases for the stdlib api itself,
173
173
  simplifying tool support.
@@ -234,7 +234,8 @@ dependencies of any kind**.
234
234
  - **[queries](https://github.com/wrmsr/omlish/blob/master/omlish/sql/queries)** - A SQL query builder with a fluent
235
235
  interface.
236
236
  - **[alchemy](https://github.com/wrmsr/omlish/blob/master/omlish/sql/alchemy)** - SQLAlchemy utilities. The codebase
237
- is moving away from SQLAlchemy however in favor of its own internal SQL api.
237
+ has moved away from SQLAlchemy in favor of its own internal SQL api, but it will likely still remain as an optional
238
+ dep for the api adapter.
238
239
 
239
240
  - **[testing](https://github.com/wrmsr/omlish/blob/master/omlish/testing)** - Test - primarily pytest - helpers,
240
241
  including:
@@ -246,6 +247,10 @@ dependencies of any kind**.
246
247
  *any-future-event-loop-impl* without having multiple fighting plugins (*[I know, I know](https://xkcd.com/927/)*).
247
248
  - **[plugins](https://github.com/wrmsr/omlish/blob/master/omlish/testing/pytest/plugins)** - Various other plugins.
248
249
 
250
+ - **[typedvalues](https://github.com/wrmsr/omlish/blob/master/omlish/typedvalues)** - A little toolkit around 'boxed'
251
+ values, whose 'box' types convey more information than the bare values themselves. A rebellion against kwargs and env
252
+ vars: instead of `foo(bar=1, baz=2)`, you do `foo(Bar(1), Baz(2))`.
253
+
249
254
  - **[lite](https://github.com/wrmsr/omlish/blob/master/omlish/lite)** - The standard library of 'lite' code. This is the
250
255
  only package beneath `lang`, and parts of it are re-exported by it for deduplication. On top of miscellaneous
251
256
  utilities it contains a handful of independent, self-contained, significantly simplified 'lite' equivalents of some
@@ -293,9 +298,8 @@ examples are:
293
298
  - **anyio** - While lite code must use only asyncio, non-trivial async standard code prefers to be written to anyio.
294
299
  - **pytest** - What is used for all standard testing - as lite code has no dependencies of any kind its testing uses
295
300
  stdlib's [unittest](https://docs.python.org/3/library/unittest.html).
296
- - **wrapt** - For (optionally-enabled) injector circular proxies.
297
- - **sqlalchemy** - Parts of the codebase use SQLAlchemy for db stuff, but it is being migrated away from in favor of the
298
- internal api. It will however likely still remain as an optional dep for the api adapter.
301
+ - **sqlalchemy** - The codebase has migrated away from SQLAlchemy in favor of the internal api but it retains it as an
302
+ optional dep to support adapting the internal api to it.
299
303
 
300
304
  Additionally, some catchall dep categories include:
301
305