omlish 0.0.0.dev161__py3-none-any.whl → 0.0.0.dev163__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 (45) hide show
  1. omlish/.manifests.json +228 -0
  2. omlish/__about__.py +2 -2
  3. omlish/asyncs/bluelet/LICENSE +6 -0
  4. omlish/asyncs/bluelet/__init__.py +0 -0
  5. omlish/asyncs/bluelet/all.py +67 -0
  6. omlish/asyncs/bluelet/api.py +23 -0
  7. omlish/asyncs/bluelet/core.py +178 -0
  8. omlish/asyncs/bluelet/events.py +78 -0
  9. omlish/asyncs/bluelet/files.py +80 -0
  10. omlish/asyncs/bluelet/runner.py +416 -0
  11. omlish/asyncs/bluelet/sockets.py +214 -0
  12. omlish/codecs/__init__.py +69 -0
  13. omlish/codecs/base.py +102 -0
  14. omlish/codecs/bytes.py +119 -0
  15. omlish/codecs/chain.py +23 -0
  16. omlish/codecs/funcs.py +28 -0
  17. omlish/codecs/registry.py +139 -0
  18. omlish/codecs/standard.py +4 -0
  19. omlish/codecs/text.py +217 -0
  20. omlish/formats/cbor.py +31 -0
  21. omlish/formats/codecs.py +93 -0
  22. omlish/formats/json/codecs.py +33 -0
  23. omlish/formats/json5.py +31 -0
  24. omlish/formats/pickle.py +31 -0
  25. omlish/formats/toml.py +17 -0
  26. omlish/formats/yaml.py +18 -0
  27. omlish/io/compress/brotli.py +15 -1
  28. omlish/io/compress/bz2.py +14 -0
  29. omlish/io/compress/codecs.py +58 -0
  30. omlish/io/compress/gzip.py +11 -0
  31. omlish/io/compress/lz4.py +14 -0
  32. omlish/io/compress/lzma.py +14 -0
  33. omlish/io/compress/snappy.py +14 -0
  34. omlish/io/compress/zlib.py +14 -0
  35. omlish/io/compress/zstd.py +14 -0
  36. omlish/lang/__init__.py +1 -0
  37. omlish/lang/functions.py +11 -0
  38. omlish/lite/inject.py +16 -29
  39. omlish/manifests/load.py +44 -6
  40. {omlish-0.0.0.dev161.dist-info → omlish-0.0.0.dev163.dist-info}/METADATA +1 -1
  41. {omlish-0.0.0.dev161.dist-info → omlish-0.0.0.dev163.dist-info}/RECORD +45 -21
  42. {omlish-0.0.0.dev161.dist-info → omlish-0.0.0.dev163.dist-info}/LICENSE +0 -0
  43. {omlish-0.0.0.dev161.dist-info → omlish-0.0.0.dev163.dist-info}/WHEEL +0 -0
  44. {omlish-0.0.0.dev161.dist-info → omlish-0.0.0.dev163.dist-info}/entry_points.txt +0 -0
  45. {omlish-0.0.0.dev161.dist-info → omlish-0.0.0.dev163.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,93 @@
1
+ import typing as ta
2
+
3
+ from .. import codecs
4
+ from .. import reflect as rfl
5
+
6
+
7
+ ObjectCodecT = ta.TypeVar('ObjectCodecT', bound='ObjectCodec')
8
+
9
+
10
+ ##
11
+
12
+
13
+ class ObjectCodec(codecs.Codec):
14
+ pass
15
+
16
+
17
+ def make_object_codec(
18
+ cls: type[ObjectCodecT],
19
+ name: str,
20
+ dumps: ta.Callable,
21
+ loads: ta.Callable,
22
+ *,
23
+ input: rfl.Type = rfl.type_(ta.Any), # noqa
24
+ aliases: ta.Collection[str] | None = None,
25
+ ) -> ObjectCodecT:
26
+ return cls(
27
+ name=name,
28
+ aliases=aliases,
29
+
30
+ input=input,
31
+ output=bytes,
32
+
33
+ new=lambda: codecs.FnPairEagerCodec.of(dumps, loads),
34
+ )
35
+
36
+
37
+ ##
38
+
39
+
40
+ class BytesObjectCodec(ObjectCodec):
41
+ pass
42
+
43
+
44
+ def make_bytes_object_codec(
45
+ name: str,
46
+ dumps: ta.Callable[[ta.Any], bytes],
47
+ loads: ta.Callable[[bytes], ta.Any],
48
+ **kwargs: ta.Any,
49
+ ) -> BytesObjectCodec:
50
+ return make_object_codec(
51
+ BytesObjectCodec,
52
+ name,
53
+ dumps,
54
+ loads,
55
+ **kwargs,
56
+ )
57
+
58
+
59
+ ##
60
+
61
+
62
+ class StrObjectCodec(ObjectCodec):
63
+ pass
64
+
65
+
66
+ def make_str_object_codec(
67
+ name: str,
68
+ dumps: ta.Callable[[ta.Any], str],
69
+ loads: ta.Callable[[str], ta.Any],
70
+ **kwargs: ta.Any,
71
+ ) -> StrObjectCodec:
72
+ return make_object_codec(
73
+ StrObjectCodec,
74
+ name,
75
+ dumps,
76
+ loads,
77
+ **kwargs,
78
+ )
79
+
80
+
81
+ ##
82
+
83
+
84
+ def make_object_lazy_loaded_codec(
85
+ mod_name: str,
86
+ attr_name: str,
87
+ codec: ObjectCodec,
88
+ ) -> codecs.LazyLoadedCodec:
89
+ return codecs.LazyLoadedCodec.new(
90
+ mod_name,
91
+ attr_name,
92
+ codec,
93
+ )
@@ -0,0 +1,33 @@
1
+ from ..codecs import make_object_lazy_loaded_codec
2
+ from ..codecs import make_str_object_codec
3
+ from .json import dumps
4
+ from .json import dumps_compact
5
+ from .json import dumps_pretty
6
+ from .json import loads
7
+
8
+
9
+ ##
10
+
11
+
12
+ JSON_CODEC = make_str_object_codec('json', dumps, loads)
13
+
14
+ # @omlish-manifest
15
+ _JSON_LAZY_CODEC = make_object_lazy_loaded_codec(__name__, 'JSON_CODEC', JSON_CODEC)
16
+
17
+
18
+ #
19
+
20
+
21
+ JSON_COMPACT_CODEC = make_str_object_codec('json-compact', dumps_compact, loads)
22
+
23
+ # @omlish-manifest
24
+ _JSON_COMPACT_LAZY_CODEC = make_object_lazy_loaded_codec(__name__, 'JSON_COMPACT_CODEC', JSON_COMPACT_CODEC)
25
+
26
+
27
+ #
28
+
29
+
30
+ JSON_PRETTY_CODEC = make_str_object_codec('json-pretty', dumps_pretty, loads)
31
+
32
+ # @omlish-manifest
33
+ _JSON_PRETTY_LAZY_CODEC = make_object_lazy_loaded_codec(__name__, 'JSON_PRETTY_CODEC', JSON_PRETTY_CODEC)
@@ -0,0 +1,31 @@
1
+ import typing as ta
2
+
3
+ from .. import lang
4
+ from .codecs import make_object_lazy_loaded_codec
5
+ from .codecs import make_str_object_codec
6
+
7
+
8
+ if ta.TYPE_CHECKING:
9
+ import json5
10
+ else:
11
+ json5 = lang.proxy_import('json5')
12
+
13
+
14
+ ##
15
+
16
+
17
+ def dumps(obj: ta.Any) -> str:
18
+ return json5.dumps(obj)
19
+
20
+
21
+ def loads(s: str) -> ta.Any:
22
+ return json5.loads(s)
23
+
24
+
25
+ ##
26
+
27
+
28
+ JSON5_CODEC = make_str_object_codec('json5', dumps, loads)
29
+
30
+ # @omlish-manifest
31
+ _JSON5_LAZY_CODEC = make_object_lazy_loaded_codec(__name__, 'JSON5_CODEC', JSON5_CODEC)
@@ -0,0 +1,31 @@
1
+ import typing as ta
2
+
3
+ from .. import lang
4
+ from .codecs import make_bytes_object_codec
5
+ from .codecs import make_object_lazy_loaded_codec
6
+
7
+
8
+ if ta.TYPE_CHECKING:
9
+ import pickle
10
+ else:
11
+ pickle = lang.proxy_import('pickle')
12
+
13
+
14
+ ##
15
+
16
+
17
+ def dump(obj: ta.Any) -> bytes:
18
+ return pickle.dumps(obj)
19
+
20
+
21
+ def load(s: bytes) -> ta.Any:
22
+ return pickle.loads(s)
23
+
24
+
25
+ ##
26
+
27
+
28
+ PICKLE_CODEC = make_bytes_object_codec('pickle', dump, load)
29
+
30
+ # @omlish-manifest
31
+ _PICKLE_LAZY_CODEC = make_object_lazy_loaded_codec(__name__, 'PICKLE_CODEC', PICKLE_CODEC)
omlish/formats/toml.py ADDED
@@ -0,0 +1,17 @@
1
+ import tomllib
2
+
3
+ from .codecs import make_object_lazy_loaded_codec
4
+ from .codecs import make_str_object_codec
5
+
6
+
7
+ ##
8
+
9
+
10
+ def _dumps(obj):
11
+ raise TypeError('Unsupported')
12
+
13
+
14
+ TOML_CODEC = make_str_object_codec('toml', _dumps, tomllib.loads)
15
+
16
+ # @omlish-manifest
17
+ _TOML_LAZY_CODEC = make_object_lazy_loaded_codec(__name__, 'TOML_CODEC', TOML_CODEC)
omlish/formats/yaml.py CHANGED
@@ -14,6 +14,8 @@ import typing as ta
14
14
  from .. import check
15
15
  from .. import dataclasses as dc
16
16
  from .. import lang
17
+ from .codecs import make_object_lazy_loaded_codec
18
+ from .codecs import make_str_object_codec
17
19
 
18
20
 
19
21
  if ta.TYPE_CHECKING:
@@ -239,3 +241,19 @@ def full_load(stream): # noqa
239
241
 
240
242
  def full_load_all(stream): # noqa # noqa
241
243
  return load_all(stream, yaml.FullLoader)
244
+
245
+
246
+ ##
247
+
248
+
249
+ def dump(obj, **kwargs):
250
+ return yaml.dump(obj, **kwargs)
251
+
252
+
253
+ ##
254
+
255
+
256
+ YAML_CODEC = make_str_object_codec('yaml', dump, safe_load, aliases=['yml'])
257
+
258
+ # @omlish-manifest
259
+ _YAML_LAZY_CODEC = make_object_lazy_loaded_codec(__name__, 'YAML_CODEC', YAML_CODEC)
@@ -3,6 +3,8 @@ import typing as ta
3
3
 
4
4
  from ... import lang
5
5
  from .base import Compression
6
+ from .codecs import make_compression_codec
7
+ from .codecs import make_compression_lazy_loaded_codec
6
8
 
7
9
 
8
10
  if ta.TYPE_CHECKING:
@@ -11,8 +13,11 @@ else:
11
13
  brotli = lang.proxy_import('brotli')
12
14
 
13
15
 
16
+ ##
17
+
18
+
14
19
  @dc.dataclass(frozen=True, kw_only=True)
15
- class SnappyCompression(Compression):
20
+ class BrotliCompression(Compression):
16
21
  mode: int | None = None
17
22
  quality: int | None = None
18
23
  lgwin: int | None = None
@@ -31,3 +36,12 @@ class SnappyCompression(Compression):
31
36
  return brotli.decompress(
32
37
  d,
33
38
  )
39
+
40
+
41
+ ##
42
+
43
+
44
+ BROTLI_CODEC = make_compression_codec('brotli', BrotliCompression)
45
+
46
+ # @omlish-manifest
47
+ _BROTLI_LAZY_CODEC = make_compression_lazy_loaded_codec(__name__, 'BROTLI_CODEC', BROTLI_CODEC)
omlish/io/compress/bz2.py CHANGED
@@ -9,6 +9,8 @@ from .adapters import CompressorObjectIncrementalAdapter
9
9
  from .adapters import DecompressorObjectIncrementalAdapter
10
10
  from .base import Compression
11
11
  from .base import IncrementalCompression
12
+ from .codecs import make_compression_codec
13
+ from .codecs import make_compression_lazy_loaded_codec
12
14
 
13
15
 
14
16
  if ta.TYPE_CHECKING:
@@ -17,6 +19,9 @@ else:
17
19
  bz2 = lang.proxy_import('bz2')
18
20
 
19
21
 
22
+ ##
23
+
24
+
20
25
  @dc.dataclass(frozen=True, kw_only=True)
21
26
  class Bz2Compression(Compression, IncrementalCompression):
22
27
  level: int = 9
@@ -45,3 +50,12 @@ class Bz2Compression(Compression, IncrementalCompression):
45
50
  bz2.BZ2Decompressor, # type: ignore
46
51
  trailing_error=OSError,
47
52
  )()
53
+
54
+
55
+ ##
56
+
57
+
58
+ BZ2_CODEC = make_compression_codec('bz2', Bz2Compression)
59
+
60
+ # @omlish-manifest
61
+ _BZ2_LAZY_CODEC = make_compression_lazy_loaded_codec(__name__, 'BZ2_CODEC', BZ2_CODEC)
@@ -0,0 +1,58 @@
1
+ import dataclasses as dc
2
+ import typing as ta
3
+
4
+ from ... import codecs
5
+ from .base import Compression
6
+
7
+
8
+ ##
9
+
10
+
11
+ @dc.dataclass(frozen=True)
12
+ class CompressionEagerCodec(codecs.EagerCodec[bytes, bytes]):
13
+ compression: Compression
14
+
15
+ def encode(self, i: bytes) -> bytes:
16
+ return self.compression.compress(i)
17
+
18
+ def decode(self, o: bytes) -> bytes:
19
+ return self.compression.decompress(o)
20
+
21
+
22
+ ##
23
+
24
+
25
+ class CompressionCodec(codecs.Codec):
26
+ pass
27
+
28
+
29
+ def make_compression_codec(
30
+ name: str,
31
+ cls: type[Compression],
32
+ *,
33
+ aliases: ta.Collection[str] | None = None,
34
+ ) -> CompressionCodec:
35
+ return CompressionCodec(
36
+ name=name,
37
+ aliases=aliases,
38
+
39
+ input=bytes,
40
+ output=bytes,
41
+
42
+ new=lambda *args, **kwargs: CompressionEagerCodec(cls(*args, **kwargs)),
43
+ )
44
+
45
+
46
+ ##
47
+
48
+
49
+ def make_compression_lazy_loaded_codec(
50
+ mod_name: str,
51
+ attr_name: str,
52
+ codec: CompressionCodec,
53
+ ) -> codecs.LazyLoadedCodec:
54
+ return codecs.LazyLoadedCodec.new(
55
+ mod_name,
56
+ attr_name,
57
+ codec,
58
+ )
@@ -48,6 +48,8 @@ from ..generators import BytesSteppedReaderGenerator
48
48
  from ..generators.readers import PrependableBytesGeneratorReader
49
49
  from .base import Compression
50
50
  from .base import IncrementalCompression
51
+ from .codecs import make_compression_codec
52
+ from .codecs import make_compression_lazy_loaded_codec
51
53
 
52
54
 
53
55
  if ta.TYPE_CHECKING:
@@ -337,3 +339,12 @@ class IncrementalGzipDecompressor:
337
339
  stream_size += len(uncompress)
338
340
  pos += len(uncompress)
339
341
  check.none((yield uncompress))
342
+
343
+
344
+ ##
345
+
346
+
347
+ GZIP_CODEC = make_compression_codec('gzip', GzipCompression, aliases=['gz'])
348
+
349
+ # @omlish-manifest
350
+ _GZIP_LAZY_CODEC = make_compression_lazy_loaded_codec(__name__, 'GZIP_CODEC', GZIP_CODEC)
omlish/io/compress/lz4.py CHANGED
@@ -6,6 +6,8 @@ from ... import lang
6
6
  from ..generators import BytesSteppedGenerator
7
7
  from .base import Compression
8
8
  from .base import IncrementalCompression
9
+ from .codecs import make_compression_codec
10
+ from .codecs import make_compression_lazy_loaded_codec
9
11
 
10
12
 
11
13
  if ta.TYPE_CHECKING:
@@ -14,6 +16,9 @@ else:
14
16
  lz4_frame = lang.proxy_import('lz4.frame')
15
17
 
16
18
 
19
+ ##
20
+
21
+
17
22
  @dc.dataclass(frozen=True, kw_only=True)
18
23
  class Lz4Compression(Compression, IncrementalCompression):
19
24
  level: int = 0
@@ -75,3 +80,12 @@ class Lz4Compression(Compression, IncrementalCompression):
75
80
  return
76
81
  if (o := decompressor.decompress(i)):
77
82
  yield o
83
+
84
+
85
+ ##
86
+
87
+
88
+ LZ4_CODEC = make_compression_codec('lz4', Lz4Compression)
89
+
90
+ # @omlish-manifest
91
+ _LZ4_LAZY_CODEC = make_compression_lazy_loaded_codec(__name__, 'LZ4_CODEC', LZ4_CODEC)
@@ -9,6 +9,8 @@ from .adapters import CompressorObjectIncrementalAdapter
9
9
  from .adapters import DecompressorObjectIncrementalAdapter
10
10
  from .base import Compression
11
11
  from .base import IncrementalCompression
12
+ from .codecs import make_compression_codec
13
+ from .codecs import make_compression_lazy_loaded_codec
12
14
 
13
15
 
14
16
  if ta.TYPE_CHECKING:
@@ -17,6 +19,9 @@ else:
17
19
  lzma = lang.proxy_import('lzma')
18
20
 
19
21
 
22
+ ##
23
+
24
+
20
25
  @dc.dataclass(frozen=True, kw_only=True)
21
26
  class LzmaCompression(Compression, IncrementalCompression):
22
27
  format: int | None = None
@@ -65,3 +70,12 @@ class LzmaCompression(Compression, IncrementalCompression):
65
70
  ),
66
71
  trailing_error=lzma.LZMAError,
67
72
  )()
73
+
74
+
75
+ ##
76
+
77
+
78
+ LZMA_CODEC = make_compression_codec('lzma', LzmaCompression)
79
+
80
+ # @omlish-manifest
81
+ _LZMA_LAZY_CODEC = make_compression_lazy_loaded_codec(__name__, 'LZMA_CODEC', LZMA_CODEC)
@@ -3,6 +3,8 @@ import typing as ta
3
3
 
4
4
  from ... import lang
5
5
  from .base import Compression
6
+ from .codecs import make_compression_codec
7
+ from .codecs import make_compression_lazy_loaded_codec
6
8
 
7
9
 
8
10
  if ta.TYPE_CHECKING:
@@ -11,6 +13,9 @@ else:
11
13
  snappy = lang.proxy_import('snappy')
12
14
 
13
15
 
16
+ ##
17
+
18
+
14
19
  @dc.dataclass(frozen=True)
15
20
  class SnappyCompression(Compression):
16
21
  def compress(self, d: bytes) -> bytes:
@@ -18,3 +23,12 @@ class SnappyCompression(Compression):
18
23
 
19
24
  def decompress(self, d: bytes) -> bytes:
20
25
  return snappy.decompress(d)
26
+
27
+
28
+ ##
29
+
30
+
31
+ SNAPPY_CODEC = make_compression_codec('snappy', SnappyCompression)
32
+
33
+ # @omlish-manifest
34
+ _SNAPPY_LAZY_CODEC = make_compression_lazy_loaded_codec(__name__, 'SNAPPY_CODEC', SNAPPY_CODEC)
@@ -9,6 +9,8 @@ from .adapters import CompressorObjectIncrementalAdapter
9
9
  from .adapters import DecompressorObjectIncrementalAdapter
10
10
  from .base import Compression
11
11
  from .base import IncrementalCompression
12
+ from .codecs import make_compression_codec
13
+ from .codecs import make_compression_lazy_loaded_codec
12
14
 
13
15
 
14
16
  if ta.TYPE_CHECKING:
@@ -17,6 +19,9 @@ else:
17
19
  zlib = lang.proxy_import('zlib')
18
20
 
19
21
 
22
+ ##
23
+
24
+
20
25
  @dc.dataclass(frozen=True, kw_only=True)
21
26
  class ZlibCompression(Compression, IncrementalCompression):
22
27
  level: int = 9
@@ -58,3 +63,12 @@ class ZlibCompression(Compression, IncrementalCompression):
58
63
  ),
59
64
  trailing_error=OSError,
60
65
  )()
66
+
67
+
68
+ ##
69
+
70
+
71
+ ZLIB_CODEC = make_compression_codec('zlib', ZlibCompression)
72
+
73
+ # @omlish-manifest
74
+ _ZLIB_LAZY_CODEC = make_compression_lazy_loaded_codec(__name__, 'ZLIB_CODEC', ZLIB_CODEC)
@@ -3,6 +3,8 @@ import typing as ta
3
3
 
4
4
  from ... import lang
5
5
  from .base import Compression
6
+ from .codecs import make_compression_codec
7
+ from .codecs import make_compression_lazy_loaded_codec
6
8
 
7
9
 
8
10
  if ta.TYPE_CHECKING:
@@ -11,6 +13,9 @@ else:
11
13
  zstandard = lang.proxy_import('zstandard')
12
14
 
13
15
 
16
+ ##
17
+
18
+
14
19
  @dc.dataclass(frozen=True, kw_only=True)
15
20
  class ZstdCompression(Compression):
16
21
  level: int | None = None
@@ -28,3 +33,12 @@ class ZstdCompression(Compression):
28
33
  d,
29
34
  max_output_size=self.max_output_size,
30
35
  )
36
+
37
+
38
+ ##
39
+
40
+
41
+ ZSTD_CODEC = make_compression_codec('zstd', ZstdCompression)
42
+
43
+ # @omlish-manifest
44
+ _ZSTD_LAZY_CODEC = make_compression_lazy_loaded_codec(__name__, 'ZSTD_CODEC', ZSTD_CODEC)
omlish/lang/__init__.py CHANGED
@@ -112,6 +112,7 @@ from .functions import ( # noqa
112
112
  issubclass_of,
113
113
  maybe_call,
114
114
  opt_coalesce,
115
+ opt_fn,
115
116
  periodically,
116
117
  raise_,
117
118
  raising,
omlish/lang/functions.py CHANGED
@@ -4,6 +4,7 @@ import time
4
4
  import typing as ta
5
5
 
6
6
 
7
+ F = ta.TypeVar('F')
7
8
  T = ta.TypeVar('T')
8
9
  P = ta.ParamSpec('P')
9
10
  CallableT = ta.TypeVar('CallableT', bound=ta.Callable)
@@ -81,6 +82,16 @@ def identity(obj: T) -> T:
81
82
  return obj
82
83
 
83
84
 
85
+ def opt_fn(fn: ta.Callable[[F], T]) -> ta.Callable[[F | None], T | None]:
86
+ @functools.wraps(fn)
87
+ def inner(v: F | None) -> T | None:
88
+ if v is not None:
89
+ return fn(v)
90
+ else:
91
+ return None
92
+ return inner
93
+
94
+
84
95
  class constant(ta.Generic[T]): # noqa
85
96
  def __init__(self, obj: T) -> None:
86
97
  super().__init__()
omlish/lite/inject.py CHANGED
@@ -610,7 +610,7 @@ class InjectorBinder:
610
610
  def __new__(cls, *args, **kwargs): # noqa
611
611
  raise TypeError
612
612
 
613
- _FN_TYPES: ta.Tuple[type, ...] = (
613
+ _FN_TYPES: ta.ClassVar[ta.Tuple[type, ...]] = (
614
614
  types.FunctionType,
615
615
  types.MethodType,
616
616
 
@@ -632,7 +632,7 @@ class InjectorBinder:
632
632
  cls._FN_TYPES = (*cls._FN_TYPES, icls)
633
633
  return icls
634
634
 
635
- _BANNED_BIND_TYPES: ta.Tuple[type, ...] = (
635
+ _BANNED_BIND_TYPES: ta.ClassVar[ta.Tuple[type, ...]] = (
636
636
  InjectorProvider,
637
637
  )
638
638
 
@@ -811,45 +811,35 @@ def bind_injector_eager_key(key: ta.Any) -> InjectorBinding:
811
811
  ##
812
812
 
813
813
 
814
- class Injection:
815
- def __new__(cls, *args, **kwargs): # noqa
816
- raise TypeError
817
-
814
+ class InjectionApi:
818
815
  # keys
819
816
 
820
- @classmethod
821
- def as_key(cls, o: ta.Any) -> InjectorKey:
817
+ def as_key(self, o: ta.Any) -> InjectorKey:
822
818
  return as_injector_key(o)
823
819
 
824
- @classmethod
825
- def array(cls, o: ta.Any) -> InjectorKey:
820
+ def array(self, o: ta.Any) -> InjectorKey:
826
821
  return dc.replace(as_injector_key(o), array=True)
827
822
 
828
- @classmethod
829
- def tag(cls, o: ta.Any, t: ta.Any) -> InjectorKey:
823
+ def tag(self, o: ta.Any, t: ta.Any) -> InjectorKey:
830
824
  return dc.replace(as_injector_key(o), tag=t)
831
825
 
832
826
  # bindings
833
827
 
834
- @classmethod
835
- def as_bindings(cls, *args: InjectorBindingOrBindings) -> InjectorBindings:
828
+ def as_bindings(self, *args: InjectorBindingOrBindings) -> InjectorBindings:
836
829
  return as_injector_bindings(*args)
837
830
 
838
- @classmethod
839
- def override(cls, p: InjectorBindings, *args: InjectorBindingOrBindings) -> InjectorBindings:
831
+ def override(self, p: InjectorBindings, *args: InjectorBindingOrBindings) -> InjectorBindings:
840
832
  return injector_override(p, *args)
841
833
 
842
834
  # injector
843
835
 
844
- @classmethod
845
- def create_injector(cls, *args: InjectorBindingOrBindings, parent: ta.Optional[Injector] = None) -> Injector:
836
+ def create_injector(self, *args: InjectorBindingOrBindings, parent: ta.Optional[Injector] = None) -> Injector:
846
837
  return _Injector(as_injector_bindings(*args), parent)
847
838
 
848
839
  # binder
849
840
 
850
- @classmethod
851
841
  def bind(
852
- cls,
842
+ self,
853
843
  obj: ta.Any,
854
844
  *,
855
845
  key: ta.Any = None,
@@ -884,32 +874,29 @@ class Injection:
884
874
 
885
875
  # helpers
886
876
 
887
- @classmethod
888
877
  def bind_factory(
889
- cls,
878
+ self,
890
879
  fn: ta.Callable[..., T],
891
880
  cls_: U,
892
881
  ann: ta.Any = None,
893
882
  ) -> InjectorBindingOrBindings:
894
- return cls.bind(make_injector_factory(fn, cls_, ann))
883
+ return self.bind(make_injector_factory(fn, cls_, ann))
895
884
 
896
- @classmethod
897
885
  def bind_array(
898
- cls,
886
+ self,
899
887
  obj: ta.Any = None,
900
888
  *,
901
889
  tag: ta.Any = None,
902
890
  ) -> InjectorBindingOrBindings:
903
891
  return bind_injector_array(obj, tag=tag)
904
892
 
905
- @classmethod
906
893
  def bind_array_type(
907
- cls,
894
+ self,
908
895
  ele: ta.Union[InjectorKey, InjectorKeyCls],
909
896
  cls_: U,
910
897
  ann: ta.Any = None,
911
898
  ) -> InjectorBindingOrBindings:
912
- return cls.bind(make_injector_array_type(ele, cls_, ann))
899
+ return self.bind(make_injector_array_type(ele, cls_, ann))
913
900
 
914
901
 
915
- inj = Injection
902
+ inj = InjectionApi()