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
@@ -5,14 +5,12 @@ from ... import check
5
5
  from ... import dataclasses as dc
6
6
  from ... import lang
7
7
  from ... import reflect as rfl
8
- from ...funcs import match as mfs
9
- from ..base.contexts import MarshalContext
10
- from ..base.contexts import UnmarshalContext
8
+ from ..base.contexts import MarshalFactoryContext
9
+ from ..base.contexts import UnmarshalFactoryContext
11
10
  from ..base.types import Marshaler
11
+ from ..base.types import MarshalerFactory
12
12
  from ..base.types import Unmarshaler
13
- from ..base.values import Value
14
- from ..factories.simple import SimpleMarshalerFactory
15
- from ..factories.simple import SimpleUnmarshalerFactory
13
+ from ..base.types import UnmarshalerFactory
16
14
  from .marshal import make_polymorphism_marshaler
17
15
  from .metadata import Impls
18
16
  from .metadata import TypeTagging
@@ -23,98 +21,6 @@ from .unmarshal import make_polymorphism_unmarshaler
23
21
  ##
24
22
 
25
23
 
26
- class MatchUnionMarshaler(Marshaler):
27
- mmf: mfs.MultiMatchFn[[UnmarshalContext, Value], ta.Any]
28
-
29
- def marshal(self, ctx: MarshalContext, o: ta.Any) -> Value:
30
- try:
31
- m = self.mmf.match(ctx, o)
32
- except mfs.AmbiguousMatchesError:
33
- raise ValueError(o) # noqa
34
- return m.fn(ctx, o)
35
-
36
-
37
- class MatchUnionUnmarshaler(Unmarshaler):
38
- mmf: mfs.MultiMatchFn[[UnmarshalContext, Value], ta.Any]
39
-
40
- def unmarshal(self, ctx: UnmarshalContext, v: Value) -> ta.Any:
41
- try:
42
- m = self.mmf.match(ctx, v)
43
- except mfs.AmbiguousMatchesError:
44
- raise ValueError(v) # noqa
45
- return m.fn(ctx, v)
46
-
47
-
48
- ##
49
-
50
-
51
- PRIMITIVE_UNION_TYPES: tuple[type, ...] = (
52
- float,
53
- int,
54
- str,
55
- )
56
-
57
-
58
- #
59
-
60
-
61
- @dc.dataclass(frozen=True)
62
- class PrimitiveUnionMarshaler(Marshaler):
63
- tys: ta.Sequence[type]
64
-
65
- def marshal(self, ctx: MarshalContext, o: ta.Any) -> Value:
66
- if type(o) not in self.tys:
67
- raise TypeError(o)
68
- return o
69
-
70
-
71
- @dc.dataclass(frozen=True)
72
- class PrimitiveUnionMarshalerFactory(SimpleMarshalerFactory):
73
- tys: ta.Sequence[type] = PRIMITIVE_UNION_TYPES
74
-
75
- def guard(self, ctx: MarshalContext, rty: rfl.Type) -> bool:
76
- return isinstance(rty, rfl.Union) and all(a in self.tys for a in rty.args)
77
-
78
- def fn(self, ctx: MarshalContext, rty: rfl.Type) -> Marshaler:
79
- args = check.isinstance(rty, rfl.Union).args
80
- return PrimitiveUnionMarshaler([t for t in self.tys if t in args])
81
-
82
-
83
- #
84
-
85
-
86
- @dc.dataclass(frozen=True)
87
- class PrimitiveUnionUnmarshaler(Unmarshaler):
88
- tys: ta.Sequence[type]
89
-
90
- def unmarshal(self, ctx: UnmarshalContext, v: Value) -> ta.Any:
91
- if type(v) not in self.tys:
92
- raise TypeError(v)
93
- return v
94
-
95
-
96
- @dc.dataclass(frozen=True)
97
- class PrimitiveUnionUnmarshalerFactory(SimpleUnmarshalerFactory):
98
- tys: ta.Sequence[type] = PRIMITIVE_UNION_TYPES
99
-
100
- def guard(self, ctx: UnmarshalContext, rty: rfl.Type) -> bool:
101
- return isinstance(rty, rfl.Union) and all(a in self.tys for a in rty.args)
102
-
103
- def fn(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
104
- args = check.isinstance(rty, rfl.Union).args
105
- return PrimitiveUnionUnmarshaler([t for t in self.tys if t in args])
106
-
107
-
108
- #
109
-
110
-
111
- PRIMITIVE_UNION_MARSHALER_FACTORY = PrimitiveUnionMarshalerFactory()
112
- PRIMITIVE_UNION_UNMARSHALER_FACTORY = PrimitiveUnionUnmarshalerFactory()
113
-
114
-
115
- ##
116
-
117
-
118
24
  @dc.dataclass(frozen=True)
119
25
  class _BasePolymorphismUnionFactory(lang.Abstract):
120
26
  impls: Impls
@@ -126,7 +32,7 @@ class _BasePolymorphismUnionFactory(lang.Abstract):
126
32
  def rtys(self) -> frozenset[rfl.Type]:
127
33
  return frozenset(i.ty for i in self.impls)
128
34
 
129
- def guard(self, ctx: MarshalContext | UnmarshalContext, rty: rfl.Type) -> bool:
35
+ def _guard(self, rty: rfl.Type) -> bool:
130
36
  if not isinstance(rty, rfl.Union):
131
37
  return False
132
38
  if self.allow_partial:
@@ -140,12 +46,16 @@ class _BasePolymorphismUnionFactory(lang.Abstract):
140
46
 
141
47
 
142
48
  @dc.dataclass(frozen=True)
143
- class PolymorphismUnionMarshalerFactory(_BasePolymorphismUnionFactory, SimpleMarshalerFactory):
144
- def fn(self, ctx: MarshalContext, rty: rfl.Type) -> Marshaler:
145
- return make_polymorphism_marshaler(self.get_impls(rty), self.tt, ctx)
49
+ class PolymorphismUnionMarshalerFactory(_BasePolymorphismUnionFactory, MarshalerFactory):
50
+ def make_marshaler(self, ctx: MarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Marshaler] | None:
51
+ if not self._guard(rty):
52
+ return None
53
+ return lambda: make_polymorphism_marshaler(self.get_impls(rty), self.tt, ctx)
146
54
 
147
55
 
148
56
  @dc.dataclass(frozen=True)
149
- class PolymorphismUnionUnmarshalerFactory(_BasePolymorphismUnionFactory, SimpleUnmarshalerFactory):
150
- def fn(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
151
- return make_polymorphism_unmarshaler(self.get_impls(rty), self.tt, ctx)
57
+ class PolymorphismUnionUnmarshalerFactory(_BasePolymorphismUnionFactory, UnmarshalerFactory):
58
+ def make_unmarshaler(self, ctx: UnmarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Unmarshaler] | None:
59
+ if not self._guard(rty):
60
+ return None
61
+ return lambda: make_polymorphism_unmarshaler(self.get_impls(rty), self.tt, ctx)
@@ -7,9 +7,10 @@ from ... import check
7
7
  from ... import lang
8
8
  from ... import reflect as rfl
9
9
  from ..base.contexts import UnmarshalContext
10
+ from ..base.contexts import UnmarshalFactoryContext
10
11
  from ..base.types import Unmarshaler
12
+ from ..base.types import UnmarshalerFactory
11
13
  from ..base.values import Value
12
- from ..factories.simple import SimpleUnmarshalerFactory
13
14
  from .metadata import FieldTypeTagging
14
15
  from .metadata import Impls
15
16
  from .metadata import Polymorphism
@@ -58,12 +59,12 @@ class FieldPolymorphismUnmarshaler(PolymorphismUnmarshaler):
58
59
  def make_polymorphism_unmarshaler(
59
60
  impls: Impls,
60
61
  tt: TypeTagging,
61
- ctx: UnmarshalContext,
62
+ ctx: UnmarshalFactoryContext,
62
63
  ) -> Unmarshaler:
63
64
  m = {
64
65
  t: u
65
66
  for i in impls
66
- for u in [ctx.make(i.ty)]
67
+ for u in [ctx.make_unmarshaler(i.ty)]
67
68
  for t in [i.tag, *i.alts]
68
69
  }
69
70
  if isinstance(tt, WrapperTypeTagging):
@@ -75,13 +76,11 @@ def make_polymorphism_unmarshaler(
75
76
 
76
77
 
77
78
  @dc.dataclass(frozen=True)
78
- class PolymorphismUnmarshalerFactory(SimpleUnmarshalerFactory):
79
+ class PolymorphismUnmarshalerFactory(UnmarshalerFactory):
79
80
  p: Polymorphism
80
81
  tt: TypeTagging = WrapperTypeTagging()
81
82
 
82
- def guard(self, ctx: UnmarshalContext, rty: rfl.Type) -> bool:
83
- return rty is self.p.ty
84
-
85
- def fn(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
86
- check.is_(rty, self.p.ty)
87
- return make_polymorphism_unmarshaler(self.p.impls, self.tt, ctx)
83
+ def make_unmarshaler(self, ctx: UnmarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Unmarshaler] | None:
84
+ if rty is not self.p.ty:
85
+ return None
86
+ return lambda: make_polymorphism_unmarshaler(self.p.impls, self.tt, ctx)
@@ -5,12 +5,14 @@ import typing as ta
5
5
  from ... import check
6
6
  from ... import reflect as rfl
7
7
  from ..base.contexts import MarshalContext
8
+ from ..base.contexts import MarshalFactoryContext
8
9
  from ..base.contexts import UnmarshalContext
10
+ from ..base.contexts import UnmarshalFactoryContext
9
11
  from ..base.types import Marshaler
12
+ from ..base.types import MarshalerFactory
10
13
  from ..base.types import Unmarshaler
14
+ from ..base.types import UnmarshalerFactory
11
15
  from ..base.values import Value
12
- from ..factories.simple import SimpleMarshalerFactory
13
- from ..factories.simple import SimpleUnmarshalerFactory
14
16
 
15
17
 
16
18
  ##
@@ -24,14 +26,11 @@ class EnumMarshaler(Marshaler):
24
26
  return o.name
25
27
 
26
28
 
27
- class EnumMarshalerFactory(SimpleMarshalerFactory):
28
- def guard(self, ctx: MarshalContext, rty: rfl.Type) -> bool:
29
- return isinstance(rty, type) and issubclass(rty, enum.Enum)
30
-
31
- def fn(self, ctx: MarshalContext, rty: rfl.Type) -> Marshaler:
32
- ty = check.isinstance(rty, type)
33
- check.state(issubclass(ty, enum.Enum))
34
- return EnumMarshaler(ty) # noqa
29
+ class EnumMarshalerFactory(MarshalerFactory):
30
+ def make_marshaler(self, ctx: MarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Marshaler] | None:
31
+ if not (isinstance(rty, type) and issubclass(rty, enum.Enum)):
32
+ return None
33
+ return lambda: EnumMarshaler(rty) # noqa
35
34
 
36
35
 
37
36
  @dc.dataclass(frozen=True)
@@ -42,11 +41,8 @@ class EnumUnmarshaler(Unmarshaler):
42
41
  return self.ty[check.isinstance(v, str)]
43
42
 
44
43
 
45
- class EnumUnmarshalerFactory(SimpleUnmarshalerFactory):
46
- def guard(self, ctx: UnmarshalContext, rty: rfl.Type) -> bool:
47
- return isinstance(rty, type) and issubclass(rty, enum.Enum)
48
-
49
- def fn(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
50
- ty = check.isinstance(rty, type)
51
- check.state(issubclass(ty, enum.Enum))
52
- return EnumUnmarshaler(ty)
44
+ class EnumUnmarshalerFactory(UnmarshalerFactory):
45
+ def make_unmarshaler(self, ctx: UnmarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Unmarshaler] | None:
46
+ if not (isinstance(rty, type) and issubclass(rty, enum.Enum)):
47
+ return None
48
+ return lambda: EnumUnmarshaler(rty) # noqa
@@ -22,6 +22,10 @@ from .composite.optionals import OptionalMarshalerFactory
22
22
  from .composite.optionals import OptionalUnmarshalerFactory
23
23
  from .composite.special import SequenceNotStrMarshalerFactory
24
24
  from .composite.special import SequenceNotStrUnmarshalerFactory
25
+ from .composite.unions.literals import LiteralUnionMarshalerFactory
26
+ from .composite.unions.literals import LiteralUnionUnmarshalerFactory
27
+ from .composite.unions.primitives import PrimitiveUnionMarshalerFactory
28
+ from .composite.unions.primitives import PrimitiveUnionUnmarshalerFactory
25
29
  from .factories.invalidate import InvalidatableMarshalerFactory
26
30
  from .factories.invalidate import InvalidatableUnmarshalerFactory
27
31
  from .factories.moduleimport.factories import ModuleImportingMarshalerFactory
@@ -36,8 +40,6 @@ from .objects.dataclasses import DataclassMarshalerFactory
36
40
  from .objects.dataclasses import DataclassUnmarshalerFactory
37
41
  from .objects.namedtuples import NamedtupleMarshalerFactory
38
42
  from .objects.namedtuples import NamedtupleUnmarshalerFactory
39
- from .polymorphism.unions import PrimitiveUnionMarshalerFactory
40
- from .polymorphism.unions import PrimitiveUnionUnmarshalerFactory
41
43
  from .singular.datetimes import DATETIME_MARSHALER_FACTORY
42
44
  from .singular.datetimes import DATETIME_UNMARSHALER_FACTORY
43
45
  from .singular.enums import EnumMarshalerFactory
@@ -65,6 +67,7 @@ DEFAULT_STANDARD_FACTORIES = StandardFactories(
65
67
  PRIMITIVE_MARSHALER_FACTORY,
66
68
  NewtypeMarshalerFactory(),
67
69
  OptionalMarshalerFactory(),
70
+ LiteralUnionMarshalerFactory(),
68
71
  PrimitiveUnionMarshalerFactory(),
69
72
  DataclassMarshalerFactory(),
70
73
  NamedtupleMarshalerFactory(),
@@ -84,6 +87,7 @@ DEFAULT_STANDARD_FACTORIES = StandardFactories(
84
87
  PRIMITIVE_UNMARSHALER_FACTORY,
85
88
  NewtypeUnmarshalerFactory(),
86
89
  OptionalUnmarshalerFactory(),
90
+ LiteralUnionUnmarshalerFactory(),
87
91
  PrimitiveUnionUnmarshalerFactory(),
88
92
  DataclassUnmarshalerFactory(),
89
93
  NamedtupleUnmarshalerFactory(),
@@ -115,11 +119,11 @@ def new_standard_marshaler_factory(
115
119
  nonlocal gl
116
120
  gl = DEFAULT_STANDARD_FACTORIES
117
121
 
118
- fi: MarshalerFactory = MultiMarshalerFactory([
122
+ fi: MarshalerFactory = MultiMarshalerFactory(
119
123
  *(first if first is not None else []),
120
124
  *gl.marshaler_factories,
121
125
  *(last if last is not None else []),
122
- ])
126
+ )
123
127
 
124
128
  fi = RecursiveMarshalerFactory(fi)
125
129
 
@@ -148,11 +152,11 @@ def new_standard_unmarshaler_factory(
148
152
  nonlocal gl
149
153
  gl = DEFAULT_STANDARD_FACTORIES
150
154
 
151
- fi: UnmarshalerFactory = MultiUnmarshalerFactory([
155
+ fi: UnmarshalerFactory = MultiUnmarshalerFactory(
152
156
  *(first if first is not None else []),
153
157
  *gl.unmarshaler_factories,
154
158
  *(last if last is not None else []),
155
- ])
159
+ )
156
160
 
157
161
  fi = RecursiveUnmarshalerFactory(fi)
158
162
 
@@ -15,7 +15,7 @@ from ..factories.typemap import TypeMapUnmarshalerFactory
15
15
 
16
16
  class AnyMarshalerUnmarshaler(Marshaler, Unmarshaler):
17
17
  def marshal(self, ctx: MarshalContext, o: ta.Any) -> Value:
18
- return ctx.make(type(o)).marshal(ctx, o)
18
+ return ctx.marshal_factory_context.make_marshaler(type(o)).marshal(ctx, o)
19
19
 
20
20
  def unmarshal(self, ctx: UnmarshalContext, v: Value) -> ta.Any:
21
21
  return v
@@ -2,45 +2,40 @@ import dataclasses as dc
2
2
  import typing as ta
3
3
 
4
4
  from ... import reflect as rfl
5
- from ...funcs import match as mfs
6
- from ..base.contexts import MarshalContext
7
- from ..base.contexts import UnmarshalContext
5
+ from ..base.contexts import MarshalFactoryContext
6
+ from ..base.contexts import UnmarshalFactoryContext
8
7
  from ..base.errors import ForbiddenTypeError
9
8
  from ..base.types import Marshaler
9
+ from ..base.types import MarshalerFactory
10
10
  from ..base.types import Unmarshaler
11
- from ..factories.simple import SimpleMarshalerFactory
12
- from ..factories.simple import SimpleUnmarshalerFactory
13
-
14
-
15
- C = ta.TypeVar('C')
16
- R = ta.TypeVar('R')
11
+ from ..base.types import UnmarshalerFactory
17
12
 
18
13
 
19
14
  ##
20
15
 
21
16
 
22
17
  @dc.dataclass(frozen=True)
23
- class ForbiddenTypeFactory(mfs.MatchFn[[C, rfl.Type], R]):
18
+ class ForbiddenTypeMarshalerFactoryUnmarshalerFactory(MarshalerFactory, UnmarshalerFactory):
24
19
  rtys: ta.AbstractSet[rfl.Type]
25
20
 
26
- def guard(self, ctx: C, rty: rfl.Type) -> bool:
27
- return rty in self.rtys
21
+ def make_marshaler(self, ctx: MarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Marshaler] | None:
22
+ if rty not in self.rtys:
23
+ return None
28
24
 
29
- def fn(self, ctx: C, rty: rfl.Type) -> R:
30
- raise ForbiddenTypeError(rty)
25
+ def inner():
26
+ raise ForbiddenTypeError(rty)
31
27
 
28
+ return inner
32
29
 
33
- @dc.dataclass(frozen=True)
34
- class ForbiddenTypeMarshalerFactory(
35
- ForbiddenTypeFactory[MarshalContext, Marshaler],
36
- SimpleMarshalerFactory,
37
- ):
38
- pass
30
+ def make_unmarshaler(self, ctx: UnmarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Unmarshaler] | None:
31
+ if rty not in self.rtys:
32
+ return None
39
33
 
34
+ def inner():
35
+ raise ForbiddenTypeError(rty)
40
36
 
41
- @dc.dataclass(frozen=True)
42
- class ForbiddenTypeUnmarshalerFactory(
43
- ForbiddenTypeFactory[UnmarshalContext, Unmarshaler],
44
- SimpleUnmarshalerFactory,
45
- ):
46
- pass
37
+ return inner
38
+
39
+
40
+ ForbiddenTypeMarshalerFactory = ForbiddenTypeMarshalerFactoryUnmarshalerFactory
41
+ ForbiddenTypeUnmarshalerFactory = ForbiddenTypeMarshalerFactoryUnmarshalerFactory
omlish/metadata.py CHANGED
@@ -19,6 +19,8 @@ from . import lang
19
19
 
20
20
  T = ta.TypeVar('T')
21
21
 
22
+ ObjectMetadataT = ta.TypeVar('ObjectMetadataT', bound='ObjectMetadata')
23
+
22
24
 
23
25
  ##
24
26
 
@@ -94,12 +96,32 @@ def append_object_metadata(obj: T, *mds: ObjectMetadata) -> T:
94
96
  _type = type
95
97
 
96
98
 
99
+ @ta.overload
100
+ def get_object_metadata(
101
+ obj: ta.Any,
102
+ *,
103
+ strict: bool = False,
104
+ type: ta.Type[ObjectMetadataT], # noqa
105
+ ) -> ta.Sequence[ObjectMetadataT]:
106
+ ...
107
+
108
+
109
+ @ta.overload
97
110
  def get_object_metadata(
98
111
  obj: ta.Any,
99
112
  *,
100
113
  strict: bool = False,
101
114
  type: ta.Type | tuple[ta.Type, ...] | None = None, # noqa
102
- ) -> ta.Sequence[ObjectMetadata]:
115
+ ) -> ta.Sequence[ta.Any]:
116
+ ...
117
+
118
+
119
+ def get_object_metadata(
120
+ obj,
121
+ *,
122
+ strict=False,
123
+ type=None, # noqa
124
+ ):
103
125
  try:
104
126
  tgt = _unwrap_object_metadata_target(obj)
105
127
  except ObjectMetadataTargetTypeError:
omlish/os/forkhooks.py CHANGED
@@ -1,5 +1,9 @@
1
1
  # ruff: noqa: UP006 UP007 UP045
2
2
  # @omlish-lite
3
+ """
4
+ TODO:
5
+ - https://github.com/python/cpython/issues/50970
6
+ """
3
7
  import os
4
8
  import threading
5
9
  import typing as ta
@@ -25,8 +25,8 @@ import sys
25
25
  import time
26
26
  import typing as ta
27
27
 
28
- from ...diag.lslocks import LslocksCommand
29
- from ...diag.lsof import LsofCommand
28
+ from ...diag.cmds.lslocks import LslocksCommand
29
+ from ...diag.cmds.lsof import LsofCommand
30
30
  from ...lite.abstract import Abstract
31
31
  from ...lite.check import check
32
32
  from ...lite.timeouts import Timeout
omlish/reflect/types.py CHANGED
@@ -9,6 +9,7 @@ give it some guiding North Star to make all of its decisions for it, and to add
9
9
  meet, join, solve, ...), but it's quite a bit of work and not a priority at the moment.
10
10
 
11
11
  TODO:
12
+ - !!! refactor like a GuardFn - no check_only, return a closure to continue computation !!!
12
13
  - !! cache this shit !!
13
14
  - especially generic_mro shit
14
15
  """
omlish/secrets/marshal.py CHANGED
@@ -54,7 +54,7 @@ def marshal_secret_field(f: dc.Field) -> dc.Field:
54
54
 
55
55
 
56
56
  @lang.static_init
57
- def _install_standard_marshalling() -> None:
57
+ def _install_standard_marshaling() -> None:
58
58
  msh.install_standard_factories(
59
59
  msh.ForbiddenTypeMarshalerFactory({Secret}),
60
60
  msh.ForbiddenTypeUnmarshalerFactory({Secret}),
@@ -28,6 +28,18 @@ See:
28
28
  - https://github.com/jmespath-community/jmespath.spec/discussions?discussions_q=label%3Ajep-candidate
29
29
  - https://github.com/jmespath-community/jmespath.spec/discussions/97
30
30
  """ # noqa
31
+ from ... import dataclasses as _dc # noqa
32
+
33
+
34
+ _dc.init_package(
35
+ globals(),
36
+ codegen=True,
37
+ )
38
+
39
+
40
+ ##
41
+
42
+
31
43
  from . import errors # noqa
32
44
  from . import functions # noqa
33
45
  from . import lexer # noqa
@@ -41,6 +53,3 @@ from .parser import ( # noqa
41
53
  from .visitor import ( # noqa
42
54
  Options,
43
55
  )
44
-
45
-
46
- __version__ = '1.0.1'