omlish 0.0.0.dev158__py3-none-any.whl → 0.0.0.dev160__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
omlish/__about__.py CHANGED
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev158'
2
- __revision__ = 'af6daf87e05e81846b224e4d0031cd101a27158b'
1
+ __version__ = '0.0.0.dev160'
2
+ __revision__ = '7a7f89f635d413c2afb755bed939daa26703116f'
3
3
 
4
4
 
5
5
  #
omlish/lite/marshal.py CHANGED
@@ -1,9 +1,7 @@
1
1
  """
2
2
  TODO:
3
3
  - pickle stdlib objs? have to pin to 3.8 pickle protocol, will be cross-version
4
- - namedtuple
5
4
  - literals
6
- - newtypes?
7
5
  """
8
6
  # ruff: noqa: UP006 UP007
9
7
  import abc
@@ -15,6 +13,7 @@ import decimal
15
13
  import enum
16
14
  import fractions
17
15
  import functools
16
+ import inspect
18
17
  import threading
19
18
  import typing as ta
20
19
  import uuid
@@ -22,8 +21,10 @@ import weakref # noqa
22
21
 
23
22
  from .check import check
24
23
  from .reflect import deep_subclasses
24
+ from .reflect import get_new_type_supertype
25
25
  from .reflect import get_optional_alias_arg
26
26
  from .reflect import is_generic_alias
27
+ from .reflect import is_new_type
27
28
  from .reflect import is_union_alias
28
29
  from .strings import snake_case
29
30
 
@@ -37,7 +38,7 @@ T = ta.TypeVar('T')
37
38
  @dc.dataclass(frozen=True)
38
39
  class ObjMarshalOptions:
39
40
  raw_bytes: bool = False
40
- nonstrict_dataclasses: bool = False
41
+ non_strict_fields: bool = False
41
42
 
42
43
 
43
44
  class ObjMarshaler(abc.ABC):
@@ -166,10 +167,10 @@ class IterableObjMarshaler(ObjMarshaler):
166
167
 
167
168
 
168
169
  @dc.dataclass(frozen=True)
169
- class DataclassObjMarshaler(ObjMarshaler):
170
+ class FieldsObjMarshaler(ObjMarshaler):
170
171
  ty: type
171
172
  fs: ta.Mapping[str, ObjMarshaler]
172
- nonstrict: bool = False
173
+ non_strict: bool = False
173
174
 
174
175
  def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
175
176
  return {
@@ -181,7 +182,7 @@ class DataclassObjMarshaler(ObjMarshaler):
181
182
  return self.ty(**{
182
183
  k: self.fs[k].unmarshal(v, ctx)
183
184
  for k, v in o.items()
184
- if not (self.nonstrict or ctx.options.nonstrict_dataclasses) or k in self.fs
185
+ if not (self.non_strict or ctx.options.non_strict_fields) or k in self.fs
185
186
  })
186
187
 
187
188
 
@@ -313,7 +314,7 @@ class ObjMarshalerManager:
313
314
  ty: ta.Any,
314
315
  rec: ta.Callable[[ta.Any], ObjMarshaler],
315
316
  *,
316
- nonstrict_dataclasses: bool = False,
317
+ non_strict_fields: bool = False,
317
318
  ) -> ObjMarshaler:
318
319
  if isinstance(ty, type):
319
320
  if abc.ABC in ty.__bases__:
@@ -335,12 +336,22 @@ class ObjMarshalerManager:
335
336
  return EnumObjMarshaler(ty)
336
337
 
337
338
  if dc.is_dataclass(ty):
338
- return DataclassObjMarshaler(
339
+ return FieldsObjMarshaler(
339
340
  ty,
340
341
  {f.name: rec(f.type) for f in dc.fields(ty)},
341
- nonstrict=nonstrict_dataclasses,
342
+ non_strict=non_strict_fields,
342
343
  )
343
344
 
345
+ if issubclass(ty, tuple) and hasattr(ty, '_fields'):
346
+ return FieldsObjMarshaler(
347
+ ty,
348
+ {p.name: rec(p.annotation) for p in inspect.signature(ty).parameters.values()},
349
+ non_strict=non_strict_fields,
350
+ )
351
+
352
+ if is_new_type(ty):
353
+ return rec(get_new_type_supertype(ty))
354
+
344
355
  if is_generic_alias(ty):
345
356
  try:
346
357
  mt = self._generic_mapping_types[ta.get_origin(ty)]
omlish/lite/reflect.py CHANGED
@@ -46,6 +46,10 @@ def is_new_type(spec: ta.Any) -> bool:
46
46
  return isinstance(spec, types.FunctionType) and spec.__code__ is ta.NewType.__code__.co_consts[1] # type: ignore # noqa
47
47
 
48
48
 
49
+ def get_new_type_supertype(spec: ta.Any) -> ta.Any:
50
+ return spec.__supertype__
51
+
52
+
49
53
  def deep_subclasses(cls: ta.Type[T]) -> ta.Iterator[ta.Type[T]]:
50
54
  seen = set()
51
55
  todo = list(reversed(cls.__subclasses__()))
omlish/lite/runtime.py CHANGED
@@ -9,9 +9,9 @@ def is_debugger_attached() -> bool:
9
9
  return any(frame[1].endswith('pydevd.py') for frame in inspect.stack())
10
10
 
11
11
 
12
- REQUIRED_PYTHON_VERSION = (3, 8)
12
+ LITE_REQUIRED_PYTHON_VERSION = (3, 8)
13
13
 
14
14
 
15
- def check_runtime_version() -> None:
16
- if sys.version_info < REQUIRED_PYTHON_VERSION:
17
- raise OSError(f'Requires python {REQUIRED_PYTHON_VERSION}, got {sys.version_info} from {sys.executable}') # noqa
15
+ def check_lite_runtime_version() -> None:
16
+ if sys.version_info < LITE_REQUIRED_PYTHON_VERSION:
17
+ raise OSError(f'Requires python {LITE_REQUIRED_PYTHON_VERSION}, got {sys.version_info} from {sys.executable}') # noqa
omlish/logs/all.py CHANGED
@@ -27,7 +27,7 @@ from .standard import ( # noqa
27
27
  STANDARD_LOG_FORMAT_PARTS,
28
28
  StandardLogFormatter,
29
29
 
30
- StandardLogHandler,
30
+ StandardConfiguredLogHandler,
31
31
 
32
32
  configure_standard_logging,
33
33
  )
omlish/logs/standard.py CHANGED
@@ -5,6 +5,7 @@ TODO:
5
5
  - structured
6
6
  - prefixed
7
7
  - debug
8
+ - optional noisy? noisy will never be lite - some kinda configure_standard callback mechanism?
8
9
  """
9
10
  import contextlib
10
11
  import datetime
@@ -49,8 +50,9 @@ class StandardLogFormatter(logging.Formatter):
49
50
  ##
50
51
 
51
52
 
52
- class StandardLogHandler(ProxyLogHandler):
53
- pass
53
+ class StandardConfiguredLogHandler(ProxyLogHandler):
54
+ def __init_subclass__(cls, **kwargs):
55
+ raise TypeError('This class serves only as a marker and should not be subclassed.')
54
56
 
55
57
 
56
58
  ##
@@ -81,7 +83,7 @@ def configure_standard_logging(
81
83
  target: ta.Optional[logging.Logger] = None,
82
84
  force: bool = False,
83
85
  handler_factory: ta.Optional[ta.Callable[[], logging.Handler]] = None,
84
- ) -> ta.Optional[StandardLogHandler]:
86
+ ) -> ta.Optional[StandardConfiguredLogHandler]:
85
87
  with _locking_logging_module_lock():
86
88
  if target is None:
87
89
  target = logging.root
@@ -89,7 +91,7 @@ def configure_standard_logging(
89
91
  #
90
92
 
91
93
  if not force:
92
- if any(isinstance(h, StandardLogHandler) for h in list(target.handlers)):
94
+ if any(isinstance(h, StandardConfiguredLogHandler) for h in list(target.handlers)):
93
95
  return None
94
96
 
95
97
  #
@@ -123,4 +125,4 @@ def configure_standard_logging(
123
125
 
124
126
  #
125
127
 
126
- return StandardLogHandler(handler)
128
+ return StandardConfiguredLogHandler(handler)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev158
3
+ Version: 0.0.0.dev160
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=RX24SRc6DCEg77PUVnaXOKCWa5TF_c9RQJdGIf7gl9c,1135
2
- omlish/__about__.py,sha256=9u37nmCWRhb45vCJ-X-WiXn0ty_9hzwZdiym8B62R9c,3409
2
+ omlish/__about__.py,sha256=YIDkVlJyMJUrEtEf00ng1bGGafE3fLQ7pZzCbPUNOjE,3409
3
3
  omlish/__init__.py,sha256=SsyiITTuK0v74XpKV8dqNaCmjOlan1JZKrHQv5rWKPA,253
4
4
  omlish/c3.py,sha256=ubu7lHwss5V4UznbejAI0qXhXahrU01MysuHOZI9C4U,8116
5
5
  omlish/cached.py,sha256=UI-XTFBwA6YXWJJJeBn-WkwBkfzDjLBBaZf4nIJA9y0,510
@@ -342,12 +342,12 @@ omlish/lite/contextmanagers.py,sha256=m9JO--p7L7mSl4cycXysH-1AO27weDKjP3DZG61cww
342
342
  omlish/lite/inject.py,sha256=729Qi0TLbQgBtkvx97q1EUMe73VFYA1hu4woXkOTcwM,23572
343
343
  omlish/lite/json.py,sha256=7-02Ny4fq-6YAu5ynvqoijhuYXWpLmfCI19GUeZnb1c,740
344
344
  omlish/lite/logs.py,sha256=CWFG0NKGhqNeEgryF5atN2gkPYbUdTINEw_s1phbINM,51
345
- omlish/lite/marshal.py,sha256=u5n43bEbct1ps8oIR7wjFCSWeyOhfHAF7LxUjELh8Jk,13830
345
+ omlish/lite/marshal.py,sha256=ldoZs_yiQIUpOjBviV9f4mwm7hSZy0hRLXrvQA-6POU,14257
346
346
  omlish/lite/maybes.py,sha256=7OlHJ8Q2r4wQ-aRbZSlJY7x0e8gDvufFdlohGEIJ3P4,833
347
347
  omlish/lite/pycharm.py,sha256=pUOJevrPClSqTCEOkQBO11LKX2003tfDcp18a03QFrc,1163
348
- omlish/lite/reflect.py,sha256=ad_ya_zZJOQB8HoNjs9yc66R54zgflwJVPJqiBXMzqA,1681
348
+ omlish/lite/reflect.py,sha256=L5_9gNp_BmAZ3l9PVezDmiXFg_6BOHbfQNB98tUULW0,1765
349
349
  omlish/lite/resources.py,sha256=YNSmX1Ohck1aoWRs55a-o5ChVbFJIQhtbqE-XwF55Oc,326
350
- omlish/lite/runtime.py,sha256=lVw5_yuQNHXZLwGf_l59u8IrAtBLZWPTml6owQ55uro,439
350
+ omlish/lite/runtime.py,sha256=XQo408zxTdJdppUZqOWHyeUR50VlCpNIExNGHz4U6O4,459
351
351
  omlish/lite/secrets.py,sha256=3Mz3V2jf__XU9qNHcH56sBSw95L3U2UPL24bjvobG0c,816
352
352
  omlish/lite/socket.py,sha256=7OYgkXTcQv0wq7TQuLnl9y6dJA1ZT6Vbc1JH59QlxgY,1792
353
353
  omlish/lite/socketserver.py,sha256=doTXIctu_6c8XneFtzPFVG_Wq6xVmA3p9ymut8IvBoU,1586
@@ -355,7 +355,7 @@ omlish/lite/strings.py,sha256=QURcE4-1pKVW8eT_5VCJpXaHDWR2dW2pYOChTJnZDiQ,1504
355
355
  omlish/lite/typing.py,sha256=U3-JaEnkDSYxK4tsu_MzUn3RP6qALBe5FXQXpD-licE,1090
356
356
  omlish/logs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
357
357
  omlish/logs/abc.py,sha256=ho4ABKYMKX-V7g4sp1BByuOLzslYzLlQ0MESmjEpT-o,8005
358
- omlish/logs/all.py,sha256=9WiEBD1_FAie8b89zq7zmy8lav2eIJUIA3SpdkXsaMQ,546
358
+ omlish/logs/all.py,sha256=4Z6cNB0E1xbX0IOQWZEWLA0Jw-yyjhXa3PD_Nvfewu8,556
359
359
  omlish/logs/color.py,sha256=02feYPZm4A7qHeBABpiar2J2E6tf-vtw1pOQAsJs_1c,668
360
360
  omlish/logs/configs.py,sha256=XOc8rWxfPpPMxJESVD2mLCUoLtbQnGnZwvYhhqe7DD8,772
361
361
  omlish/logs/filters.py,sha256=2noFRyBez3y519fpfsDSt1vo8wX-85b8sMXZi5o_xyE,208
@@ -363,7 +363,7 @@ omlish/logs/handlers.py,sha256=zgSnKQA5q9Fu7T0Nkd7twog9H1Wg9-bDCzz4_F1TOBo,319
363
363
  omlish/logs/json.py,sha256=zyqMWpZY3lk4WRk4wgmataBomGX9S3iDsydiM1sS-lI,1366
364
364
  omlish/logs/noisy.py,sha256=Ubc-eTH6ZbGYsLfUUi69JAotwuUwzb-SJBeGo_0dIZI,348
365
365
  omlish/logs/proxy.py,sha256=A-ROPUUAlF397qTbEqhel6YhQMstNuXL3Xmts7w9dAo,2347
366
- omlish/logs/standard.py,sha256=FO2pK-jXW55LkjX6OZZj1keKOYeZfq8SbpHodubgSRo,2903
366
+ omlish/logs/standard.py,sha256=BVFn8pFyafxuco1sjA5COYxX5Q0Wv80_OE9zo6uDp2Q,3164
367
367
  omlish/logs/utils.py,sha256=mzHrZ9ji75p5A8qR29eUr05CBAHMb8J753MSkID_VaQ,393
368
368
  omlish/manifests/__init__.py,sha256=P2B0dpT8D7l5lJwRGPA92IcQj6oeXfd90X5-q9BJrKg,51
369
369
  omlish/manifests/load.py,sha256=8R-S5CyQpAbxDHt5wcNF6mAYri8bGndn6R2uEVOh52Y,4809
@@ -525,9 +525,9 @@ omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,329
525
525
  omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
526
526
  omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
527
527
  omlish/text/random.py,sha256=jNWpqiaKjKyTdMXC-pWAsSC10AAP-cmRRPVhm59ZWLk,194
528
- omlish-0.0.0.dev158.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
529
- omlish-0.0.0.dev158.dist-info/METADATA,sha256=Xdok31SNsavtWgVVYt_kPTdjncdziI2ByRjAj1QQJRs,4264
530
- omlish-0.0.0.dev158.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
531
- omlish-0.0.0.dev158.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
532
- omlish-0.0.0.dev158.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
533
- omlish-0.0.0.dev158.dist-info/RECORD,,
528
+ omlish-0.0.0.dev160.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
529
+ omlish-0.0.0.dev160.dist-info/METADATA,sha256=CZH9L3qhAM-tYsJfEokB-s2fTLnRy-QMkOSnErJHumc,4264
530
+ omlish-0.0.0.dev160.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
531
+ omlish-0.0.0.dev160.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
532
+ omlish-0.0.0.dev160.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
533
+ omlish-0.0.0.dev160.dist-info/RECORD,,