omlish 0.0.0.dev12__py3-none-any.whl → 0.0.0.dev14__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.
omlish/__about__.py CHANGED
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev12'
2
- __revision__ = 'b35ec8b30c5a0e8c2cb883539abc75fd33de252a'
1
+ __version__ = '0.0.0.dev14'
2
+ __revision__ = '6d7ee2004110d9e34b2463374a8ec3961c87e8e2'
3
3
 
4
4
 
5
5
  #
@@ -10,7 +10,7 @@ class ProjectBase:
10
10
  authors = [{'name': 'wrmsr'}]
11
11
  urls = {'source': 'https://github.com/wrmsr/omlish'}
12
12
  license = {'text': 'BSD-3-Clause'}
13
- requires_python = '>=3.12'
13
+ requires_python = '~=3.12'
14
14
 
15
15
  version = __version__
16
16
 
@@ -30,61 +30,65 @@ class Project(ProjectBase):
30
30
 
31
31
  optional_dependencies = {
32
32
  'async': [
33
- 'anyio >= 4.4',
34
- 'sniffio >= 1.3',
33
+ 'anyio ~= 4.4',
34
+ 'sniffio ~= 1.3',
35
35
 
36
- 'greenlet >= 3; python_version < "3.13"',
36
+ 'greenlet ~= 3.0; python_version < "3.13"',
37
37
 
38
- 'trio >= 0.26',
39
- 'trio-asyncio >= 0.15; python_version < "3.13"',
38
+ 'trio ~= 0.26',
39
+ 'trio-asyncio ~= 0.15; python_version < "3.13"',
40
40
  ],
41
41
 
42
42
  'compression': [
43
- 'lz4 >= 4',
44
- 'python-snappy >= 0.7; python_version < "3.13"',
45
- 'zstd >= 1.5',
43
+ 'lz4 ~= 4.0',
44
+ 'python-snappy ~= 0.7; python_version < "3.13"',
45
+ 'zstd ~= 1.5',
46
+ ],
47
+
48
+ 'diag': [
49
+ 'psutil ~= 6.0',
46
50
  ],
47
51
 
48
52
  'formats': [
53
+ 'cloudpickle ~= 3.0',
54
+ 'json5 ~= 0.9',
49
55
  'orjson > 3.10',
50
- 'cloudpickle >= 3',
51
- 'pyyaml >= 5',
56
+ 'pyyaml ~= 5.0',
52
57
  ],
53
58
 
54
59
  'http': [
55
- 'httpx[http2] >= 0.27',
60
+ 'httpx[http2] ~= 0.27',
56
61
  ],
57
62
 
58
63
  'misc': [
59
- 'jinja2 >= 3.1',
60
- 'psutil >= 6',
61
- 'wrapt >= 1.14',
64
+ 'jinja2 ~= 3.1',
65
+ 'wrapt ~= 1.14',
62
66
  ],
63
67
 
64
68
  'secrets': [
65
- 'cryptography >= 43',
69
+ 'cryptography ~= 43.0',
66
70
  ],
67
71
 
68
72
  'sql': [
69
- 'sqlalchemy >= 2; python_version >= "3.13"',
70
- 'sqlalchemy[asyncio] >= 2; python_version < "3.13"',
73
+ 'sqlalchemy ~= 2.0; python_version ~= "3.13"',
74
+ 'sqlalchemy[asyncio] ~= 2.0; python_version < "3.13"',
71
75
 
72
- 'pg8000 >= 1.31',
73
- 'pymysql >= 1.1',
76
+ 'pg8000 ~= 1.31',
77
+ 'pymysql ~= 1.1',
74
78
 
75
- 'aiomysql >= 0.2',
76
- 'aiosqlite >= 0.20',
77
- 'asyncpg >= 0.29; python_version < "3.13"',
79
+ 'aiomysql ~= 0.2',
80
+ 'aiosqlite ~= 0.20',
81
+ 'asyncpg ~= 0.29; python_version < "3.13"',
78
82
  ],
79
83
 
80
84
  'sqlx': [
81
- 'sqlean.py >= 3.45; python_version < "3.13"',
85
+ 'sqlean.py ~= 3.45; python_version < "3.13"',
82
86
 
83
- 'duckdb >= 1',
87
+ 'duckdb ~= 1.0',
84
88
  ],
85
89
 
86
90
  'testing': [
87
- 'pytest >= 8',
91
+ 'pytest ~= 8.0',
88
92
  ],
89
93
  }
90
94
 
omlish/check.py CHANGED
@@ -9,7 +9,7 @@ import typing as ta
9
9
  T = ta.TypeVar('T')
10
10
  SizedT = ta.TypeVar('SizedT', bound=ta.Sized)
11
11
 
12
- Message = str | ta.Callable[..., str | None] | None
12
+ Message: ta.TypeAlias = str | ta.Callable[..., str | None] | None
13
13
 
14
14
  _NONE_TYPE = type(None)
15
15
 
@@ -52,7 +52,7 @@ from .indexed import ( # noqa
52
52
  from .mappings import ( # noqa
53
53
  MissingDict,
54
54
  TypeMap,
55
- TypeMultiMap,
55
+ DynamicTypeMap,
56
56
  guarded_map_update,
57
57
  multikey_dict,
58
58
  yield_dict_init,
@@ -78,7 +78,7 @@ class TypeMap(ta.Generic[T]):
78
78
  return self._dct[ty]
79
79
 
80
80
 
81
- class TypeMultiMap(ta.Generic[V]):
81
+ class DynamicTypeMap(ta.Generic[V]):
82
82
 
83
83
  def __init__(self, items: ta.Iterable[V] = (), *, weak: bool = False) -> None:
84
84
  super().__init__()
omlish/fnpairs.py CHANGED
@@ -6,6 +6,15 @@ TODO:
6
6
  - cbor
7
7
  - alt json backends
8
8
  - wrapped (wait for usecase)
9
+ - streams
10
+ - fileobj -> fileobj?
11
+
12
+ Compression choice:
13
+ - lzma if-available minimal-space
14
+ - lz4 if-available write-once
15
+ - zstd if-available
16
+ - bz2 write-once (but no parallel decompress)
17
+ - gz
9
18
  """
10
19
  import abc
11
20
  import codecs
omlish/lite/secrets.py CHANGED
@@ -1,10 +1,11 @@
1
+ # ruff: noqa: UP007
1
2
  import typing as ta
2
3
 
3
4
 
4
5
  class Secret:
5
6
  _VALUE_ATTR = '__secret_value__'
6
7
 
7
- def __init__(self, *, key: str | None, value: str) -> None:
8
+ def __init__(self, *, key: ta.Optional[str], value: str) -> None:
8
9
  super().__init__()
9
10
  self._key = key
10
11
  setattr(self, self._VALUE_ATTR, lambda: value)
@@ -56,6 +56,8 @@ from .objects import ( # noqa
56
56
  from .polymorphism import ( # noqa
57
57
  Impl,
58
58
  Polymorphism,
59
+ PolymorphismMarshalerFactory,
60
+ PolymorphismUnmarshalerFactory,
59
61
  polymorphism_from_subclasses,
60
62
  )
61
63
 
@@ -15,6 +15,13 @@ from .base import UnmarshalerFactoryMatchClass
15
15
  from .values import Value
16
16
 
17
17
 
18
+ DEFAULT_ITERABLE_CONCRETE_TYPES: dict[type[collections.abc.Iterable], type[collections.abc.Iterable]] = {
19
+ collections.abc.Iterable: tuple, # type: ignore
20
+ collections.abc.Sequence: tuple, # type: ignore
21
+ collections.abc.MutableSequence: list, # type: ignore
22
+ }
23
+
24
+
18
25
  @dc.dataclass(frozen=True)
19
26
  class IterableMarshaler(Marshaler):
20
27
  e: Marshaler
@@ -47,7 +54,8 @@ class IterableUnmarshalerFactory(UnmarshalerFactoryMatchClass):
47
54
  @mfs.simple(lambda _, ctx, rty: isinstance(rty, rfl.Generic) and issubclass(rty.cls, collections.abc.Iterable))
48
55
  def _build_generic(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
49
56
  gty = check.isinstance(rty, rfl.Generic)
50
- return IterableUnmarshaler(gty.cls, ctx.make(check.single(gty.args)))
57
+ cty = DEFAULT_ITERABLE_CONCRETE_TYPES.get(gty.cls, gty.cls) # noqa
58
+ return IterableUnmarshaler(cty, ctx.make(check.single(gty.args)))
51
59
 
52
60
  @mfs.simple(lambda _, ctx, rty: isinstance(rty, type) and issubclass(rty, collections.abc.Iterable))
53
61
  def _build_concrete(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
@@ -14,6 +14,12 @@ from .base import UnmarshalerFactoryMatchClass
14
14
  from .values import Value
15
15
 
16
16
 
17
+ DEFAULT_MAPPING_CONCRETE_TYPES: dict[type[collections.abc.Mapping], type[collections.abc.Mapping]] = {
18
+ collections.abc.Mapping: dict, # type: ignore
19
+ collections.abc.MutableMapping: dict, # type: ignore
20
+ }
21
+
22
+
17
23
  @dc.dataclass(frozen=True)
18
24
  class MappingMarshaler(Marshaler):
19
25
  ke: Marshaler
@@ -55,8 +61,9 @@ class MappingUnmarshalerFactory(UnmarshalerFactoryMatchClass):
55
61
  @mfs.simple(lambda _, ctx, rty: isinstance(rty, rfl.Generic) and issubclass(rty.cls, collections.abc.Mapping))
56
62
  def _build_generic(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
57
63
  gty = check.isinstance(rty, rfl.Generic)
64
+ cty = DEFAULT_MAPPING_CONCRETE_TYPES.get(gty.cls, gty.cls) # noqa
58
65
  kt, vt = gty.args
59
- return MappingUnmarshaler(gty.cls, ctx.make(kt), ctx.make(vt))
66
+ return MappingUnmarshaler(cty, ctx.make(kt), ctx.make(vt))
60
67
 
61
68
  @mfs.simple(lambda _, ctx, rty: isinstance(rty, type) and issubclass(rty, collections.abc.Mapping))
62
69
  def _build_concrete(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
@@ -0,0 +1,59 @@
1
+ import dataclasses as dc
2
+ import typing as ta
3
+
4
+ from .. import check
5
+ from .. import lang
6
+ from .. import matchfns as mfs
7
+ from .. import reflect as rfl
8
+ from .base import MarshalContext
9
+ from .base import Marshaler
10
+ from .base import MarshalerFactoryMatchClass
11
+ from .base import UnmarshalContext
12
+ from .base import Unmarshaler
13
+ from .base import UnmarshalerFactoryMatchClass
14
+ from .values import Value
15
+
16
+
17
+ @dc.dataclass(frozen=True)
18
+ class MaybeMarshaler(Marshaler):
19
+ e: Marshaler
20
+
21
+ def marshal(self, ctx: MarshalContext, o: ta.Any) -> Value:
22
+ m: lang.Maybe = o
23
+ if m.present:
24
+ return [self.e.marshal(ctx, m.must())]
25
+ else:
26
+ return []
27
+
28
+
29
+ class MaybeMarshalerFactory(MarshalerFactoryMatchClass):
30
+ @mfs.simple(lambda _, ctx, rty: isinstance(rty, rfl.Generic) and rty.cls is lang.Maybe)
31
+ def _build_generic(self, ctx: MarshalContext, rty: rfl.Type) -> Marshaler:
32
+ gty = check.isinstance(rty, rfl.Generic)
33
+ return MaybeMarshaler(ctx.make(check.single(gty.args)))
34
+
35
+ @mfs.simple(lambda _, ctx, rty: isinstance(rty, type) and issubclass(rty, lang.Maybe))
36
+ def _build_concrete(self, ctx: MarshalContext, rty: rfl.Type) -> Marshaler:
37
+ return MaybeMarshaler(ctx.make(ta.Any))
38
+
39
+
40
+ @dc.dataclass(frozen=True)
41
+ class MaybeUnmarshaler(Unmarshaler):
42
+ e: Unmarshaler
43
+
44
+ def unmarshal(self, ctx: UnmarshalContext, v: Value) -> ta.Any:
45
+ if v:
46
+ return lang.just(self.e.unmarshal(ctx, check.single(v))) # type: ignore
47
+ else:
48
+ return lang.empty()
49
+
50
+
51
+ class MaybeUnmarshalerFactory(UnmarshalerFactoryMatchClass):
52
+ @mfs.simple(lambda _, ctx, rty: isinstance(rty, rfl.Generic) and rty.cls is lang.Maybe)
53
+ def _build_generic(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
54
+ gty = check.isinstance(rty, rfl.Generic)
55
+ return MaybeUnmarshaler(ctx.make(check.single(gty.args)))
56
+
57
+ @mfs.simple(lambda _, ctx, rty: isinstance(rty, type) and issubclass(rty, lang.Maybe))
58
+ def _build_concrete(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
59
+ return MaybeUnmarshaler(ctx.make(ta.Any))
@@ -2,6 +2,7 @@
2
2
  TODO:
3
3
  - auto-gen from __subclasses__ if abstract
4
4
  - cfg: unless prefixed with _ or abstract
5
+ - iff Sealed
5
6
  - auto-name
6
7
  """
7
8
  import collections.abc
@@ -19,6 +19,8 @@ from .iterables import IterableMarshalerFactory
19
19
  from .iterables import IterableUnmarshalerFactory
20
20
  from .mappings import MappingMarshalerFactory
21
21
  from .mappings import MappingUnmarshalerFactory
22
+ from .maybes import MaybeMarshalerFactory
23
+ from .maybes import MaybeUnmarshalerFactory
22
24
  from .numbers import NUMBERS_MARSHALER_FACTORY
23
25
  from .numbers import NUMBERS_UNMARSHALER_FACTORY
24
26
  from .optionals import OptionalMarshalerFactory
@@ -41,6 +43,7 @@ STANDARD_MARSHALER_FACTORIES: list[MarshalerFactory] = [
41
43
  UUID_MARSHALER_FACTORY,
42
44
  BASE64_MARSHALER_FACTORY,
43
45
  DATETIME_MARSHALER_FACTORY,
46
+ MaybeMarshalerFactory(),
44
47
  MappingMarshalerFactory(),
45
48
  IterableMarshalerFactory(),
46
49
  ANY_MARSHALER_FACTORY,
@@ -69,6 +72,7 @@ STANDARD_UNMARSHALER_FACTORIES: list[UnmarshalerFactory] = [
69
72
  UUID_UNMARSHALER_FACTORY,
70
73
  BASE64_UNMARSHALER_FACTORY,
71
74
  DATETIME_UNMARSHALER_FACTORY,
75
+ MaybeUnmarshalerFactory(),
72
76
  MappingUnmarshalerFactory(),
73
77
  IterableUnmarshalerFactory(),
74
78
  ANY_UNMARSHALER_FACTORY,
omlish/reflect/types.py CHANGED
@@ -250,12 +250,13 @@ def type_(obj: ta.Any) -> Type:
250
250
  if isinstance(obj, type):
251
251
  if issubclass(obj, ta.Generic): # type: ignore
252
252
  params = get_params(obj)
253
- return Generic(
254
- obj,
255
- params,
256
- params,
257
- obj,
258
- )
253
+ if params:
254
+ return Generic(
255
+ obj,
256
+ params,
257
+ params,
258
+ obj,
259
+ )
259
260
  return obj
260
261
 
261
262
  if isinstance(obj, _SpecialGenericAlias):
@@ -0,0 +1,80 @@
1
+ Metadata-Version: 2.1
2
+ Name: omlish
3
+ Version: 0.0.0.dev14
4
+ Summary: omlish
5
+ Author: wrmsr
6
+ License: BSD-3-Clause
7
+ Project-URL: source, https://github.com/wrmsr/omlish
8
+ Classifier: License :: OSI Approved :: BSD License
9
+ Classifier: Development Status :: 2 - Pre-Alpha
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: Operating System :: OS Independent
12
+ Classifier: Operating System :: POSIX
13
+ Requires-Python: ~=3.12
14
+ License-File: LICENSE
15
+ Provides-Extra: all
16
+ Requires-Dist: anyio ~=4.4 ; extra == 'all'
17
+ Requires-Dist: sniffio ~=1.3 ; extra == 'all'
18
+ Requires-Dist: trio ~=0.26 ; extra == 'all'
19
+ Requires-Dist: lz4 ~=4.0 ; extra == 'all'
20
+ Requires-Dist: zstd ~=1.5 ; extra == 'all'
21
+ Requires-Dist: psutil ~=6.0 ; extra == 'all'
22
+ Requires-Dist: cloudpickle ~=3.0 ; extra == 'all'
23
+ Requires-Dist: json5 ~=0.9 ; extra == 'all'
24
+ Requires-Dist: orjson >3.10 ; extra == 'all'
25
+ Requires-Dist: pyyaml ~=5.0 ; extra == 'all'
26
+ Requires-Dist: httpx[http2] ~=0.27 ; extra == 'all'
27
+ Requires-Dist: jinja2 ~=3.1 ; extra == 'all'
28
+ Requires-Dist: wrapt ~=1.14 ; extra == 'all'
29
+ Requires-Dist: cryptography ~=43.0 ; extra == 'all'
30
+ Requires-Dist: pg8000 ~=1.31 ; extra == 'all'
31
+ Requires-Dist: pymysql ~=1.1 ; extra == 'all'
32
+ Requires-Dist: aiomysql ~=0.2 ; extra == 'all'
33
+ Requires-Dist: aiosqlite ~=0.20 ; extra == 'all'
34
+ Requires-Dist: duckdb ~=1.0 ; extra == 'all'
35
+ Requires-Dist: pytest ~=8.0 ; extra == 'all'
36
+ Requires-Dist: greenlet ~=3.0 ; (python_version < "3.13") and extra == 'all'
37
+ Requires-Dist: trio-asyncio ~=0.15 ; (python_version < "3.13") and extra == 'all'
38
+ Requires-Dist: python-snappy ~=0.7 ; (python_version < "3.13") and extra == 'all'
39
+ Requires-Dist: sqlalchemy[asyncio] ~=2.0 ; (python_version < "3.13") and extra == 'all'
40
+ Requires-Dist: asyncpg ~=0.29 ; (python_version < "3.13") and extra == 'all'
41
+ Requires-Dist: sqlean.py ~=3.45 ; (python_version < "3.13") and extra == 'all'
42
+ Requires-Dist: sqlalchemy ~=2.0 ; (python_version ~= "3.13") and extra == 'all'
43
+ Provides-Extra: async
44
+ Requires-Dist: anyio ~=4.4 ; extra == 'async'
45
+ Requires-Dist: sniffio ~=1.3 ; extra == 'async'
46
+ Requires-Dist: trio ~=0.26 ; extra == 'async'
47
+ Requires-Dist: greenlet ~=3.0 ; (python_version < "3.13") and extra == 'async'
48
+ Requires-Dist: trio-asyncio ~=0.15 ; (python_version < "3.13") and extra == 'async'
49
+ Provides-Extra: compression
50
+ Requires-Dist: lz4 ~=4.0 ; extra == 'compression'
51
+ Requires-Dist: zstd ~=1.5 ; extra == 'compression'
52
+ Requires-Dist: python-snappy ~=0.7 ; (python_version < "3.13") and extra == 'compression'
53
+ Provides-Extra: diag
54
+ Requires-Dist: psutil ~=6.0 ; extra == 'diag'
55
+ Provides-Extra: formats
56
+ Requires-Dist: cloudpickle ~=3.0 ; extra == 'formats'
57
+ Requires-Dist: json5 ~=0.9 ; extra == 'formats'
58
+ Requires-Dist: orjson >3.10 ; extra == 'formats'
59
+ Requires-Dist: pyyaml ~=5.0 ; extra == 'formats'
60
+ Provides-Extra: http
61
+ Requires-Dist: httpx[http2] ~=0.27 ; extra == 'http'
62
+ Provides-Extra: misc
63
+ Requires-Dist: jinja2 ~=3.1 ; extra == 'misc'
64
+ Requires-Dist: wrapt ~=1.14 ; extra == 'misc'
65
+ Provides-Extra: secrets
66
+ Requires-Dist: cryptography ~=43.0 ; extra == 'secrets'
67
+ Provides-Extra: sql
68
+ Requires-Dist: pg8000 ~=1.31 ; extra == 'sql'
69
+ Requires-Dist: pymysql ~=1.1 ; extra == 'sql'
70
+ Requires-Dist: aiomysql ~=0.2 ; extra == 'sql'
71
+ Requires-Dist: aiosqlite ~=0.20 ; extra == 'sql'
72
+ Requires-Dist: sqlalchemy[asyncio] ~=2.0 ; (python_version < "3.13") and extra == 'sql'
73
+ Requires-Dist: asyncpg ~=0.29 ; (python_version < "3.13") and extra == 'sql'
74
+ Requires-Dist: sqlalchemy ~=2.0 ; (python_version ~= "3.13") and extra == 'sql'
75
+ Provides-Extra: sqlx
76
+ Requires-Dist: duckdb ~=1.0 ; extra == 'sqlx'
77
+ Requires-Dist: sqlean.py ~=3.45 ; (python_version < "3.13") and extra == 'sqlx'
78
+ Provides-Extra: testing
79
+ Requires-Dist: pytest ~=8.0 ; extra == 'testing'
80
+
@@ -1,16 +1,16 @@
1
- omlish/__about__.py,sha256=izHgi4tLqykkJ7ZSMoTzByFQFy7lJ7aY-vVzRDfYXKQ,2338
1
+ omlish/__about__.py,sha256=2zVkeXvQ1CHLPrKoB44VisIZ0Pt3SPdWHxPCBgTXG8Q,2416
2
2
  omlish/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  omlish/argparse.py,sha256=QRQmX9G0-L_nATkFtGHvpd4qrpYzKATdjuFLbBqzJPM,6224
4
4
  omlish/bootstrap.py,sha256=3pGNiHlUcQl81q76_Wesd4pblmy82EOKkcdgectF15Q,18820
5
5
  omlish/c3.py,sha256=W5EwYx9Por3rWYLkKUitJ6OoRMLLgVTfLTyroOz41Y0,8047
6
6
  omlish/cached.py,sha256=UAizxlH4eMWHPzQtmItmyE6FEpFEUFzIkxaO2BHWZ5s,196
7
- omlish/check.py,sha256=aeFjTwZfcZHMY2tJ4RozonuOg_LVvPMgyP94CfuR0Sk,5529
7
+ omlish/check.py,sha256=o3UJnIEmmRsv9ggIIDtz8fDSudW1CatxbwxP42M4dno,5543
8
8
  omlish/concurrent.py,sha256=3KkTj5TOPmvNOcuK9LtOQwmkuLzoEYQfcuaHTXSQ0Ts,5424
9
9
  omlish/datetimes.py,sha256=HajeM1kBvwlTa-uR1TTZHmZ3zTPnnUr1uGGQhiO1XQ0,2152
10
10
  omlish/defs.py,sha256=N8O1murtr4mdSE_vjAcWGfnN7GyBXbW8rJM4qPF8na0,4737
11
11
  omlish/docker.py,sha256=5WyXJyFwqIJJ11QWwPIjHjDHnsaOVZszZAjyTvg3xew,4693
12
12
  omlish/dynamic.py,sha256=35C_cCX_Vq2HrHzGk5T-zbrMvmUdiIiwDzDNixczoDo,6541
13
- omlish/fnpairs.py,sha256=Bt_5dfjI4c-ejU9SSSWxozKGLgB-7xMrn86h5J79UNU,10404
13
+ omlish/fnpairs.py,sha256=tKX991ICOtBgWJrZsuSVryzVOmNkCobwUXyk4uNpsCY,10600
14
14
  omlish/iterators.py,sha256=GGLC7RIT86uXMjhIIIqnff_Iu5SI_b9rXYywYGFyzmo,7292
15
15
  omlish/libc.py,sha256=u0481imCiTFqP_e-v9g0pD-0WD249j5vYzhtn-fnNkY,15308
16
16
  omlish/matchfns.py,sha256=o2evI7q0CAMHR8RQ_Jks6L0UoNpEDltnLjOiamJDtmU,6155
@@ -28,7 +28,7 @@ omlish/asyncs/bridge.py,sha256=AabrRVz5k75dTB59M70DWkl6JrLusjhpvsaj5jld9io,8151
28
28
  omlish/asyncs/flavors.py,sha256=kp1RdcsNrvDQZMB4Q_hlHyjrREJqEWjY9BI1lbE1AQ8,4820
29
29
  omlish/asyncs/trio.py,sha256=GKG3wgelFr7gIKKHZhcflvMyCvxXHNZe862KB0Xw2uA,370
30
30
  omlish/asyncs/trio_asyncio.py,sha256=oqdOHy0slj9PjVxaDf3gJkq9AAgg7wYZbB469jOftVw,1327
31
- omlish/collections/__init__.py,sha256=7b0pjRiTXxh5p49SX9U5HQ4njsQehKik-Qe9A6Gf8qM,1658
31
+ omlish/collections/__init__.py,sha256=h7gXQNMI_46hRRlIAI3PTaewMV8H381FV_KlONReg9s,1660
32
32
  omlish/collections/_abc.py,sha256=sP7BpTVhx6s6C59mTFeosBi4rHOWC6tbFBYbxdZmvh0,2365
33
33
  omlish/collections/_io_abc.py,sha256=Cxs8KB1B_69rxpUYxI-MTsilAmNooJJn3w07DKqYKkE,1255
34
34
  omlish/collections/coerce.py,sha256=o11AMrUiyoadd8WkdqeKPIpXf2xd0LyylzNCyJivCLU,7036
@@ -36,7 +36,7 @@ omlish/collections/exceptions.py,sha256=shcS-NCnEUudF8qC_SmO2TQyjivKlS4TDjaz_faq
36
36
  omlish/collections/frozen.py,sha256=DGxemj_pVID85tSBm-Wns_x4ov0wOEIT6X5bVgJtmkA,4152
37
37
  omlish/collections/identity.py,sha256=jhEpC8tnfh3Sg-MJff1Fp9eMydt150wits_UeVdctUk,2723
38
38
  omlish/collections/indexed.py,sha256=YHs_q0GALisXPKKMgeDQxZ6hMzYndqDL3m3ag8cnzH0,2143
39
- omlish/collections/mappings.py,sha256=5D7xZabUY6n1nB-BrZlcrPy_AdzLZ6IyihuLeDL48pA,3188
39
+ omlish/collections/mappings.py,sha256=eEifLZez-BWunTuj6974bGxBFfNRODZpu6Oa7_2ME94,3190
40
40
  omlish/collections/ordered.py,sha256=RzEC3fHvrDeJQSWThVDNYQKke263Vje1II5YwtDwT1Q,2335
41
41
  omlish/collections/persistent.py,sha256=KG471s0bhhReQrjlmX0xaN9HeAIcrtT264ddZCxsExo,875
42
42
  omlish/collections/skiplist.py,sha256=xjuKZtSScp1VnOi9lpf7I090vGp1DnjA5ELjFhMeGps,5987
@@ -186,7 +186,7 @@ omlish/lite/logs.py,sha256=VrZMlHgUK6o1zHaKNgHLecIozv49cZ8vwY43wJ_6-pE,2646
186
186
  omlish/lite/marshal.py,sha256=5uwri-KzPiktnbYORkGXcJ4kulZvp_nS4MxPsU1Y-G0,8608
187
187
  omlish/lite/reflect.py,sha256=9QYJwdINraq1JNMEgvoqeSlVvRRgOXpxAkpgX8EgRXc,1307
188
188
  omlish/lite/runtime.py,sha256=VUhmNQvwf8QzkWSKj4Q0ReieJA_PzHaJNRBivfTseow,452
189
- omlish/lite/secrets.py,sha256=ToaS10AcH7UOFi7XHKp2mikLErp1Rrne5mtFJ388hF8,462
189
+ omlish/lite/secrets.py,sha256=FEc47dcU9M1CyMTnrihAAVwKf0ySZLahf83djOEDWXw,488
190
190
  omlish/lite/strings.py,sha256=9dO_A6EkhcTZ2xmOUGSOMT-mx9BnoOzYu1-ocSrDJaA,670
191
191
  omlish/lite/subprocesses.py,sha256=KuGV3ImehMjCUK0JoV3pUtG_7o5wei1lRDn9HxzByAg,3063
192
192
  omlish/logs/__init__.py,sha256=UPMdG3mbUm4PUJw6muXs4dk-uNE0aMDj_XebKCa-Wpk,224
@@ -194,7 +194,7 @@ omlish/logs/_abc.py,sha256=UgrCUQVUi_PvT3p1CEkb3P74CFrFcZq2AFby3GEUv9M,5974
194
194
  omlish/logs/configs.py,sha256=Dnd5nm6OUD_n4YDtP4VuDo8flIofU-xf7xlw-t9FVv8,1285
195
195
  omlish/logs/formatters.py,sha256=AFs9C6-qrFkgXZ0nL39wih_LGck1Tc79alvGyibBdQo,720
196
196
  omlish/logs/utils.py,sha256=MgGovbP0zUrZ3FGD3qYNQWn-l0jy0Y0bStcQvv5BOmQ,391
197
- omlish/marshal/__init__.py,sha256=52Jl7SgSA0Ei7TBrNmcbXCcICiU6oBS9NhjGg8zvgKI,1383
197
+ omlish/marshal/__init__.py,sha256=ggU_UVW-CyXZnsaGwx-Cxj4PUAY0QsXmaXVLFO8T4rQ,1453
198
198
  omlish/marshal/any.py,sha256=e82OyYK3Emm1P1ClnsnxP7fIWC2iNVyW0H5nK4mLmWM,779
199
199
  omlish/marshal/base.py,sha256=Oa9FIF4SVDao7QYvPIHPMp_kp4sA6JfLSV4aEcprYTk,5931
200
200
  omlish/marshal/base64.py,sha256=Q3ibujdhgFgDaeHahSe7WdcqvOyalWigwUlV-U-2ckQ,1018
@@ -205,16 +205,17 @@ omlish/marshal/exceptions.py,sha256=jwQWn4LcPnadT2KRI_1JJCOSkwWh0yHnYK9BmSkNN4U,
205
205
  omlish/marshal/factories.py,sha256=UV2Svjok-lTWsRqKGh-CeuAhvlohw9uJe7ZLyoKMvTM,2968
206
206
  omlish/marshal/forbidden.py,sha256=BNshzm4lN5O8sUZ1YvxrSYq3WPklq9NMQCRZ7RC3DLM,865
207
207
  omlish/marshal/global_.py,sha256=8XCjPcIjA65StESshzNfQiSyuckVaEiiWROmC3qk0mo,1117
208
- omlish/marshal/iterables.py,sha256=y4EZirLrbv_RGG29cq6TsrEbEPjt1GEyuH3BNYkGQFU,2245
209
- omlish/marshal/mappings.py,sha256=-7n_4j52fGieV_ANF7qlMzk0nkeXWMrBEQI5OTvW2bo,2516
208
+ omlish/marshal/iterables.py,sha256=6I_ZdJemLSQtJ4J5NrB9wi-eyxiJZS61HzHXp1yeiX8,2592
209
+ omlish/marshal/mappings.py,sha256=zhLtyot7tzQtBNj7C4RBxjMELxA5r2q2Mth8Br7xkFs,2803
210
+ omlish/marshal/maybes.py,sha256=tKkVsJATERgbVcEfBnsHBK_2_LCQIVyBzca-cA-9KH0,2112
210
211
  omlish/marshal/naming.py,sha256=UCviMAXTTUpW1lyAGymybGP2rFUAW44P1X0zrIVbvi4,464
211
212
  omlish/marshal/numbers.py,sha256=oY_yMNJEnJhjfLh89gpPXvKqeUyhQcaTcQB6ecyHiG8,1704
212
213
  omlish/marshal/objects.py,sha256=JD7GBY1hYUyRpCufpxDAwgII98ewzGDct2IF0HxgFN0,2767
213
214
  omlish/marshal/optionals.py,sha256=r0XB5rqfasvgZJNrKYd6Unq2U4nHt3JURi26j0dYHlw,1499
214
- omlish/marshal/polymorphism.py,sha256=KBH4VnMl0SdSfjGNtZumBT7q3jB8wkDT5DKF7SD64C4,5582
215
+ omlish/marshal/polymorphism.py,sha256=gyvNYUAkmQVhWrcXBLzXINxqx6RHyulf9n16Iv38PFI,5597
215
216
  omlish/marshal/primitives.py,sha256=-gLR_RTPTM8YP6t6PL5sNM1lAtwcZDHc9lxkimoQ9jw,1097
216
217
  omlish/marshal/registries.py,sha256=GI2KogcxawMkk02Ky7-TsnijChoe1I7YTOPIbUNwSAI,1665
217
- omlish/marshal/standard.py,sha256=747rai9Rq0zTWQMIL2gLmU7p7c2tyHYosfQJipMS1-c,2657
218
+ omlish/marshal/standard.py,sha256=059gc16ycgqFbBz1F3rCkbi5lgxH9sQt9We-ghiLpBs,2803
218
219
  omlish/marshal/utils.py,sha256=puKJpwPpuDlMOIrKMcLTRLJyMiL6n_Xs-p59AuDEymA,543
219
220
  omlish/marshal/uuids.py,sha256=H4B7UX_EPNmP2tC8bubcKrPLTS4aQu98huvbXQ3Zv2g,910
220
221
  omlish/marshal/values.py,sha256=ssHiWdg_L6M17kAn8GiGdPW7UeQOm3RDikWkvwblf5I,263
@@ -222,7 +223,7 @@ omlish/reflect/__init__.py,sha256=iWDCNJNP4afPcv-MxZRJSIRQ4NRw6XYPyRHhBXb5YIA,66
222
223
  omlish/reflect/isinstance.py,sha256=x5T9S2634leinBT4hl3CZZkRttvdvvlxChkC_x9Qu2s,1176
223
224
  omlish/reflect/ops.py,sha256=RJ6jzrM4ieFsXzWyNXWV43O_WgzEaUvlHSc5N2ezW2A,2044
224
225
  omlish/reflect/subst.py,sha256=JM2RGv2-Rcex8wCqhmgvRG59zD242P9jM3O2QLjKWWo,3586
225
- omlish/reflect/types.py,sha256=_AZeSkqraWkDBrBEq5mT4DiTS98ZHyiWR7TFSVJqJSk,6815
226
+ omlish/reflect/types.py,sha256=R9AH5YnOvdZs6QhzJ6VmjvcvGibQEQi6YqK25f5VUxw,6862
226
227
  omlish/secrets/__init__.py,sha256=VKB2IF9vz4h4RXcZxgXj36KXOLcGBzfqVnxPgPDWpmg,408
227
228
  omlish/secrets/crypto.py,sha256=6CsLy0UEqCrBK8Xx_3-iFF6SKtu2GlEqUQ8-MliY3tk,3709
228
229
  omlish/secrets/marshal.py,sha256=nVzsvQH5w3T2oMP7DCc1SLKxyR5e66psM57VOQoL0QA,2086
@@ -260,8 +261,8 @@ omlish/text/delimit.py,sha256=ubPXcXQmtbOVrUsNh5gH1mDq5H-n1y2R4cPL5_DQf68,4928
260
261
  omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,3296
261
262
  omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
262
263
  omlish/text/parts.py,sha256=KGgo0wHOIMVMZtDso-rhSWKAcAkYAH2IGpg9tULabu8,6505
263
- omlish-0.0.0.dev12.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
264
- omlish-0.0.0.dev12.dist-info/METADATA,sha256=0QsB_sFImufctXgwlmQWcwoq8GttI7wLkE5a8OYso0o,3563
265
- omlish-0.0.0.dev12.dist-info/WHEEL,sha256=UvcQYKBHoFqaQd6LKyqHw9fxEolWLQnlzP0h_LgJAfI,91
266
- omlish-0.0.0.dev12.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
267
- omlish-0.0.0.dev12.dist-info/RECORD,,
264
+ omlish-0.0.0.dev14.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
265
+ omlish-0.0.0.dev14.dist-info/METADATA,sha256=ZEbsp-L49uyeqOh-kN3-Hda8oSu65aNEeucQXjLnCTw,3716
266
+ omlish-0.0.0.dev14.dist-info/WHEEL,sha256=uCRv0ZEik_232NlR4YDw4Pv3Ajt5bKvMH13NUU7hFuI,91
267
+ omlish-0.0.0.dev14.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
268
+ omlish-0.0.0.dev14.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (74.0.0)
2
+ Generator: setuptools (74.1.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,77 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: omlish
3
- Version: 0.0.0.dev12
4
- Summary: omlish
5
- Author: wrmsr
6
- License: BSD-3-Clause
7
- Project-URL: source, https://github.com/wrmsr/omlish
8
- Classifier: License :: OSI Approved :: BSD License
9
- Classifier: Development Status :: 2 - Pre-Alpha
10
- Classifier: Intended Audience :: Developers
11
- Classifier: Operating System :: OS Independent
12
- Classifier: Operating System :: POSIX
13
- Requires-Python: >=3.12
14
- License-File: LICENSE
15
- Provides-Extra: all
16
- Requires-Dist: anyio >=4.4 ; extra == 'all'
17
- Requires-Dist: sniffio >=1.3 ; extra == 'all'
18
- Requires-Dist: trio >=0.26 ; extra == 'all'
19
- Requires-Dist: lz4 >=4 ; extra == 'all'
20
- Requires-Dist: zstd >=1.5 ; extra == 'all'
21
- Requires-Dist: orjson >3.10 ; extra == 'all'
22
- Requires-Dist: cloudpickle >=3 ; extra == 'all'
23
- Requires-Dist: pyyaml >=5 ; extra == 'all'
24
- Requires-Dist: httpx[http2] >=0.27 ; extra == 'all'
25
- Requires-Dist: jinja2 >=3.1 ; extra == 'all'
26
- Requires-Dist: psutil >=6 ; extra == 'all'
27
- Requires-Dist: wrapt >=1.14 ; extra == 'all'
28
- Requires-Dist: cryptography >=43 ; extra == 'all'
29
- Requires-Dist: pg8000 >=1.31 ; extra == 'all'
30
- Requires-Dist: pymysql >=1.1 ; extra == 'all'
31
- Requires-Dist: aiomysql >=0.2 ; extra == 'all'
32
- Requires-Dist: aiosqlite >=0.20 ; extra == 'all'
33
- Requires-Dist: duckdb >=1 ; extra == 'all'
34
- Requires-Dist: pytest >=8 ; extra == 'all'
35
- Requires-Dist: greenlet >=3 ; (python_version < "3.13") and extra == 'all'
36
- Requires-Dist: trio-asyncio >=0.15 ; (python_version < "3.13") and extra == 'all'
37
- Requires-Dist: python-snappy >=0.7 ; (python_version < "3.13") and extra == 'all'
38
- Requires-Dist: sqlalchemy[asyncio] >=2 ; (python_version < "3.13") and extra == 'all'
39
- Requires-Dist: asyncpg >=0.29 ; (python_version < "3.13") and extra == 'all'
40
- Requires-Dist: sqlean.py >=3.45 ; (python_version < "3.13") and extra == 'all'
41
- Requires-Dist: sqlalchemy >=2 ; (python_version >= "3.13") and extra == 'all'
42
- Provides-Extra: async
43
- Requires-Dist: anyio >=4.4 ; extra == 'async'
44
- Requires-Dist: sniffio >=1.3 ; extra == 'async'
45
- Requires-Dist: trio >=0.26 ; extra == 'async'
46
- Requires-Dist: greenlet >=3 ; (python_version < "3.13") and extra == 'async'
47
- Requires-Dist: trio-asyncio >=0.15 ; (python_version < "3.13") and extra == 'async'
48
- Provides-Extra: compression
49
- Requires-Dist: lz4 >=4 ; extra == 'compression'
50
- Requires-Dist: zstd >=1.5 ; extra == 'compression'
51
- Requires-Dist: python-snappy >=0.7 ; (python_version < "3.13") and extra == 'compression'
52
- Provides-Extra: formats
53
- Requires-Dist: orjson >3.10 ; extra == 'formats'
54
- Requires-Dist: cloudpickle >=3 ; extra == 'formats'
55
- Requires-Dist: pyyaml >=5 ; extra == 'formats'
56
- Provides-Extra: http
57
- Requires-Dist: httpx[http2] >=0.27 ; extra == 'http'
58
- Provides-Extra: misc
59
- Requires-Dist: jinja2 >=3.1 ; extra == 'misc'
60
- Requires-Dist: psutil >=6 ; extra == 'misc'
61
- Requires-Dist: wrapt >=1.14 ; extra == 'misc'
62
- Provides-Extra: secrets
63
- Requires-Dist: cryptography >=43 ; extra == 'secrets'
64
- Provides-Extra: sql
65
- Requires-Dist: pg8000 >=1.31 ; extra == 'sql'
66
- Requires-Dist: pymysql >=1.1 ; extra == 'sql'
67
- Requires-Dist: aiomysql >=0.2 ; extra == 'sql'
68
- Requires-Dist: aiosqlite >=0.20 ; extra == 'sql'
69
- Requires-Dist: sqlalchemy[asyncio] >=2 ; (python_version < "3.13") and extra == 'sql'
70
- Requires-Dist: asyncpg >=0.29 ; (python_version < "3.13") and extra == 'sql'
71
- Requires-Dist: sqlalchemy >=2 ; (python_version >= "3.13") and extra == 'sql'
72
- Provides-Extra: sqlx
73
- Requires-Dist: duckdb >=1 ; extra == 'sqlx'
74
- Requires-Dist: sqlean.py >=3.45 ; (python_version < "3.13") and extra == 'sqlx'
75
- Provides-Extra: testing
76
- Requires-Dist: pytest >=8 ; extra == 'testing'
77
-