omlish 0.0.0.dev227__py3-none-any.whl → 0.0.0.dev229__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.
Files changed (47) hide show
  1. omlish/__about__.py +3 -3
  2. omlish/diag/lsof.py +4 -5
  3. omlish/diag/ps.py +9 -0
  4. omlish/lite/timeouts.py +1 -1
  5. omlish/marshal/__init__.py +39 -24
  6. omlish/marshal/composite/__init__.py +0 -0
  7. omlish/marshal/{iterables.py → composite/iterables.py} +10 -10
  8. omlish/marshal/{literals.py → composite/literals.py} +9 -9
  9. omlish/marshal/{mappings.py → composite/mappings.py} +10 -10
  10. omlish/marshal/{maybes.py → composite/maybes.py} +11 -11
  11. omlish/marshal/{newtypes.py → composite/newtypes.py} +8 -8
  12. omlish/marshal/{optionals.py → composite/optionals.py} +9 -9
  13. omlish/marshal/objects/__init__.py +7 -0
  14. omlish/marshal/{dataclasses.py → objects/dataclasses.py} +24 -24
  15. omlish/marshal/{helpers.py → objects/helpers.py} +6 -3
  16. omlish/marshal/objects/marshal.py +108 -0
  17. omlish/marshal/objects/metadata.py +124 -0
  18. omlish/marshal/{namedtuples.py → objects/namedtuples.py} +16 -16
  19. omlish/marshal/objects/unmarshal.py +141 -0
  20. omlish/marshal/polymorphism/__init__.py +7 -0
  21. omlish/marshal/polymorphism/marshal.py +66 -0
  22. omlish/marshal/polymorphism/metadata.py +140 -0
  23. omlish/marshal/{unions.py → polymorphism/unions.py} +18 -18
  24. omlish/marshal/polymorphism/unmarshal.py +73 -0
  25. omlish/marshal/singular/__init__.py +0 -0
  26. omlish/marshal/{any.py → singular/any.py} +8 -8
  27. omlish/marshal/{base64.py → singular/base64.py} +9 -9
  28. omlish/marshal/{datetimes.py → singular/datetimes.py} +9 -9
  29. omlish/marshal/{enums.py → singular/enums.py} +9 -9
  30. omlish/marshal/{numbers.py → singular/numbers.py} +8 -8
  31. omlish/marshal/{primitives.py → singular/primitives.py} +8 -8
  32. omlish/marshal/{uuids.py → singular/uuids.py} +8 -8
  33. omlish/marshal/standard.py +32 -32
  34. omlish/os/death.py +72 -4
  35. omlish/os/fcntl.py +11 -12
  36. omlish/os/files.py +18 -3
  37. omlish/os/forkhooks.py +215 -0
  38. omlish/os/pidfiles/pinning.py +4 -0
  39. omlish/sockets/bind.py +4 -4
  40. {omlish-0.0.0.dev227.dist-info → omlish-0.0.0.dev229.dist-info}/METADATA +3 -3
  41. {omlish-0.0.0.dev227.dist-info → omlish-0.0.0.dev229.dist-info}/RECORD +45 -36
  42. omlish/marshal/objects.py +0 -317
  43. omlish/marshal/polymorphism.py +0 -267
  44. {omlish-0.0.0.dev227.dist-info → omlish-0.0.0.dev229.dist-info}/LICENSE +0 -0
  45. {omlish-0.0.0.dev227.dist-info → omlish-0.0.0.dev229.dist-info}/WHEEL +0 -0
  46. {omlish-0.0.0.dev227.dist-info → omlish-0.0.0.dev229.dist-info}/entry_points.txt +0 -0
  47. {omlish-0.0.0.dev227.dist-info → omlish-0.0.0.dev229.dist-info}/top_level.txt +0 -0
@@ -1,267 +0,0 @@
1
- """
2
- TODO:
3
- - auto-gen from __subclasses__ if abstract
4
- - cfg: unless prefixed with _ or abstract
5
- - iff Sealed
6
- - auto-name
7
- """
8
- import collections.abc
9
- import dataclasses as dc
10
- import typing as ta
11
-
12
- from .. import check
13
- from .. import lang
14
- from .. import reflect as rfl
15
- from .base import MarshalContext
16
- from .base import Marshaler
17
- from .base import MarshalerFactory
18
- from .base import UnmarshalContext
19
- from .base import Unmarshaler
20
- from .base import UnmarshalerFactory
21
- from .naming import Naming
22
- from .naming import translate_name
23
- from .registries import RegistryItem
24
- from .values import Value
25
-
26
-
27
- ##
28
-
29
-
30
- class TypeTagging(RegistryItem, lang.Abstract, lang.Sealed):
31
- pass
32
-
33
-
34
- class WrapperTypeTagging(TypeTagging, lang.Final):
35
- pass
36
-
37
-
38
- @dc.dataclass(frozen=True)
39
- class FieldTypeTagging(TypeTagging, lang.Final):
40
- field: str
41
-
42
-
43
- ##
44
-
45
-
46
- @dc.dataclass(frozen=True)
47
- class Impl:
48
- ty: type
49
- tag: str
50
- alts: ta.AbstractSet[str] = frozenset()
51
-
52
-
53
- class Impls(ta.Sequence[Impl]):
54
- def __init__(
55
- self,
56
- lst: ta.Iterable[Impl],
57
- ) -> None:
58
- super().__init__()
59
- self._lst = list(lst)
60
-
61
- by_ty: dict[type, Impl] = {}
62
- by_tag: dict[str, Impl] = {}
63
- for i in self._lst:
64
- if i.ty in by_ty:
65
- raise TypeError(i.ty)
66
- if i.tag in by_tag:
67
- raise NameError(i.tag)
68
- for a in i.alts:
69
- if a in by_tag:
70
- raise NameError(a)
71
- by_ty[i.ty] = i
72
- by_tag[i.tag] = i
73
- for a in i.alts:
74
- by_tag[a] = i
75
- self._by_ty = by_ty
76
- self._by_tag = by_tag
77
-
78
- def __iter__(self) -> ta.Iterator[Impl]:
79
- return iter(self._lst)
80
-
81
- def __len__(self) -> int:
82
- return len(self._lst)
83
-
84
- @ta.overload
85
- def __getitem__(self, index: int) -> Impl: ...
86
-
87
- @ta.overload
88
- def __getitem__(self, index: slice) -> ta.Sequence[Impl]: ...
89
-
90
- def __getitem__(self, index):
91
- return self._lst[index]
92
-
93
- @property
94
- def by_ty(self) -> ta.Mapping[type, Impl]:
95
- return self._by_ty
96
-
97
- @property
98
- def by_tag(self) -> ta.Mapping[str, Impl]:
99
- return self._by_tag
100
-
101
-
102
- class Polymorphism:
103
- def __init__(
104
- self,
105
- ty: type,
106
- impls: ta.Iterable[Impl],
107
- ) -> None:
108
- super().__init__()
109
- self._ty = ty
110
- self._impls = Impls(impls)
111
-
112
- for i in self._impls:
113
- if not issubclass(i.ty, ty):
114
- raise TypeError(i.ty, ty)
115
-
116
- @property
117
- def ty(self) -> type:
118
- return self._ty
119
-
120
- @property
121
- def impls(self) -> Impls:
122
- return self._impls
123
-
124
-
125
- def polymorphism_from_subclasses(
126
- ty: type,
127
- *,
128
- naming: Naming | None = None,
129
- strip_suffix: bool = False,
130
- ) -> Polymorphism:
131
- dct: dict[str, Impl] = {}
132
-
133
- seen: set[type] = set()
134
- todo: list[type] = [ty]
135
- while todo:
136
- cur = todo.pop()
137
- seen.add(cur)
138
-
139
- todo.extend(nxt for nxt in cur.__subclasses__() if nxt not in seen)
140
-
141
- if lang.is_abstract_class(cur):
142
- continue
143
-
144
- name = cur.__name__
145
- if strip_suffix:
146
- name = lang.strip_suffix(name, ty.__name__)
147
- if naming is not None:
148
- name = translate_name(name, naming)
149
- if name in dct:
150
- raise KeyError(f'Duplicate name: {name}')
151
-
152
- dct[name] = Impl(
153
- cur,
154
- name,
155
- )
156
-
157
- return Polymorphism(ty, dct.values())
158
-
159
-
160
- ##
161
-
162
-
163
- @dc.dataclass(frozen=True)
164
- class WrapperPolymorphismMarshaler(Marshaler):
165
- m: ta.Mapping[type, tuple[str, Marshaler]]
166
-
167
- def marshal(self, ctx: MarshalContext, o: ta.Any | None) -> Value:
168
- tag, m = self.m[type(o)]
169
- return {tag: m.marshal(ctx, o)}
170
-
171
-
172
- @dc.dataclass(frozen=True)
173
- class FieldPolymorphismMarshaler(Marshaler):
174
- m: ta.Mapping[type, tuple[str, Marshaler]]
175
- tf: str
176
-
177
- def marshal(self, ctx: MarshalContext, o: ta.Any | None) -> Value:
178
- tag, m = self.m[type(o)]
179
- return {self.tf: tag, **m.marshal(ctx, o)} # type: ignore
180
-
181
-
182
- def make_polymorphism_marshaler(
183
- impls: Impls,
184
- tt: TypeTagging,
185
- ctx: MarshalContext,
186
- ) -> Marshaler:
187
- m = {
188
- i.ty: (i.tag, ctx.make(i.ty))
189
- for i in impls
190
- }
191
- if isinstance(tt, WrapperTypeTagging):
192
- return WrapperPolymorphismMarshaler(m)
193
- elif isinstance(tt, FieldTypeTagging):
194
- return FieldPolymorphismMarshaler(m, tt.field)
195
- else:
196
- raise TypeError(tt)
197
-
198
-
199
- @dc.dataclass(frozen=True)
200
- class PolymorphismMarshalerFactory(MarshalerFactory):
201
- p: Polymorphism
202
- tt: TypeTagging = WrapperTypeTagging()
203
-
204
- def guard(self, ctx: MarshalContext, rty: rfl.Type) -> bool:
205
- return rty is self.p.ty
206
-
207
- def fn(self, ctx: MarshalContext, rty: rfl.Type) -> Marshaler:
208
- check.is_(rty, self.p.ty)
209
- return make_polymorphism_marshaler(self.p.impls, self.tt, ctx)
210
-
211
-
212
- ##
213
-
214
-
215
- @dc.dataclass(frozen=True)
216
- class WrapperPolymorphismUnmarshaler(Unmarshaler):
217
- m: ta.Mapping[str, Unmarshaler]
218
-
219
- def unmarshal(self, ctx: UnmarshalContext, v: Value) -> ta.Any | None:
220
- ma = check.isinstance(v, collections.abc.Mapping)
221
- [(tag, iv)] = ma.items()
222
- u = self.m[tag]
223
- return u.unmarshal(ctx, iv)
224
-
225
-
226
- @dc.dataclass(frozen=True)
227
- class FieldPolymorphismUnmarshaler(Unmarshaler):
228
- m: ta.Mapping[str, Unmarshaler]
229
- tf: str
230
-
231
- def unmarshal(self, ctx: UnmarshalContext, v: Value) -> ta.Any | None:
232
- ma = dict(check.isinstance(v, collections.abc.Mapping))
233
- tag = ma.pop(self.tf)
234
- u = self.m[tag]
235
- return u.unmarshal(ctx, ma)
236
-
237
-
238
- def make_polymorphism_unmarshaler(
239
- impls: Impls,
240
- tt: TypeTagging,
241
- ctx: UnmarshalContext,
242
- ) -> Unmarshaler:
243
- m = {
244
- t: u
245
- for i in impls
246
- for u in [ctx.make(i.ty)]
247
- for t in [i.tag, *i.alts]
248
- }
249
- if isinstance(tt, WrapperTypeTagging):
250
- return WrapperPolymorphismUnmarshaler(m)
251
- elif isinstance(tt, FieldTypeTagging):
252
- return FieldPolymorphismUnmarshaler(m, tt.field)
253
- else:
254
- raise TypeError(tt)
255
-
256
-
257
- @dc.dataclass(frozen=True)
258
- class PolymorphismUnmarshalerFactory(UnmarshalerFactory):
259
- p: Polymorphism
260
- tt: TypeTagging = WrapperTypeTagging()
261
-
262
- def guard(self, ctx: UnmarshalContext, rty: rfl.Type) -> bool:
263
- return rty is self.p.ty
264
-
265
- def fn(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
266
- check.is_(rty, self.p.ty)
267
- return make_polymorphism_unmarshaler(self.p.impls, self.tt, ctx)