omlish 0.0.0.dev217__py3-none-any.whl → 0.0.0.dev218__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,123 @@
1
+ # @omlish-lite
2
+ # ruff: noqa: UP006 UP007
3
+ import threading
4
+ import time
5
+ import typing as ta
6
+
7
+ from ...lite.check import check
8
+ from ..addresses import SocketAndAddress
9
+ from .handlers import SocketServerHandler
10
+
11
+
12
+ ##
13
+
14
+
15
+ class ThreadingSocketServerHandler:
16
+ def __init__(
17
+ self,
18
+ handler: SocketServerHandler,
19
+ *,
20
+ shutdown_timeout: ta.Optional[float] = None,
21
+ ) -> None:
22
+ super().__init__()
23
+
24
+ self._handler = handler
25
+ self._shutdown_timeout = shutdown_timeout
26
+
27
+ self._lock = threading.RLock()
28
+ self._threads: ta.List[threading.Thread] = []
29
+ self._is_shutdown = False
30
+
31
+ @property
32
+ def handler(self) -> SocketServerHandler:
33
+ return self._handler
34
+
35
+ #
36
+
37
+ def __call__(self, conn: SocketAndAddress) -> None:
38
+ self.handle(conn)
39
+
40
+ def handle(self, conn: SocketAndAddress) -> None:
41
+ with self._lock:
42
+ check.state(not self._is_shutdown)
43
+
44
+ self._reap()
45
+
46
+ t = threading.Thread(
47
+ target=self._handler,
48
+ args=(conn,),
49
+ )
50
+
51
+ self._threads.append(t)
52
+
53
+ t.start()
54
+
55
+ #
56
+
57
+ def _reap(self) -> None:
58
+ with self._lock:
59
+ self._threads[:] = (thread for thread in self._threads if thread.is_alive())
60
+
61
+ def is_alive(self) -> bool:
62
+ with self._lock:
63
+ self._reap()
64
+
65
+ return bool(self._threads)
66
+
67
+ def join(self, timeout: ta.Optional[float] = None) -> None:
68
+ if timeout is not None:
69
+ deadline: ta.Optional[float] = time.time() + timeout
70
+ else:
71
+ deadline = None
72
+
73
+ def calc_timeout() -> ta.Optional[float]:
74
+ if deadline is None:
75
+ return None
76
+
77
+ tt = deadline - time.time()
78
+ if tt <= 0:
79
+ raise TimeoutError
80
+
81
+ return tt
82
+
83
+ if not (self._lock.acquire(timeout=calc_timeout() or -1)):
84
+ raise TimeoutError
85
+
86
+ try:
87
+ self._reap()
88
+
89
+ for t in self._threads:
90
+ t.join(timeout=calc_timeout())
91
+
92
+ if t.is_alive():
93
+ raise TimeoutError
94
+
95
+ finally:
96
+ self._lock.release()
97
+
98
+ #
99
+
100
+ class _NOT_SET: # noqa
101
+ def __new__(cls, *args, **kwargs): # noqa
102
+ raise TypeError
103
+
104
+ def shutdown(
105
+ self,
106
+ block: bool = False,
107
+ timeout: ta.Union[float, None, ta.Type[_NOT_SET]] = _NOT_SET,
108
+ ) -> None:
109
+ self._is_shutdown = True
110
+
111
+ if block:
112
+ if timeout is self._NOT_SET:
113
+ timeout = self._shutdown_timeout
114
+
115
+ self.join(timeout=timeout) # type: ignore
116
+
117
+ #
118
+
119
+ def __enter__(self) -> 'ThreadingSocketServerHandler':
120
+ return self
121
+
122
+ def __exit__(self, exc_type, exc_val, exc_tb):
123
+ self.shutdown()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: omlish
3
- Version: 0.0.0.dev217
3
+ Version: 0.0.0.dev218
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=YGmAnUBszmosQQ_7Hh2wwtDiYdYZ4unNKYzOtALuels,7968
2
- omlish/__about__.py,sha256=kDIujbwF1DOvbfOg4BotM1Kd9bV-L3rLG99gQZvd-EU,3380
2
+ omlish/__about__.py,sha256=0BtXUJi7KSCGQMkzet9GL1mr4dSvaRR9Jv-gAz1olhc,3380
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
@@ -224,9 +224,11 @@ omlish/docker/consts.py,sha256=wvwfUtEFrEWZKfREWqSMrx8xjjl8P5MNUSF6qzzgJHY,70
224
224
  omlish/docker/detect.py,sha256=Qrdbosm2wJkxKDuy8gaGmbQoxk4Wnp1HJjAEz58NA8Y,614
225
225
  omlish/docker/hub.py,sha256=7LIuJGdA-N1Y1dmo50ynKM1KUTcnQM_5XbtPbdT_QLU,3940
226
226
  omlish/docker/manifests.py,sha256=LR4FpOGNUT3bZQ-gTjB6r_-1C3YiG30QvevZjrsVUQM,7068
227
- omlish/docker/oci.py,sha256=wbiOpZQWZtiCtyoDpZhYyHvwkZv5przil9DRLAvHrfs,2743
228
227
  omlish/docker/portrelay.py,sha256=QlRoTnQXs5INguR7XOj1xH0gNdL9SUeZm5z45DUctXo,1222
229
228
  omlish/docker/timebomb.py,sha256=A_pgIDaXKsQwPiikrCTgIJl91gwYqkPGFY6j-Naq07Q,342
229
+ omlish/docker/oci/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
230
+ omlish/docker/oci/data.py,sha256=4KtSxziT70BhF30ozQ1SCfX4y0LT_5x0CuOKC4zrEV4,2616
231
+ omlish/docker/oci/media.py,sha256=fJ8VcU-edDpg-FyJQamw-sUlhTghkC-WQ1TC4MiRpFU,4499
230
232
  omlish/formats/__init__.py,sha256=T0AG1gFnqQ5JiHN0UPQjQ-7g5tnxMIG-mgOvMYExYAM,21
231
233
  omlish/formats/cbor.py,sha256=o_Hbe4kthO9CeXK-FySrw0dHVlrdyTo2Y8PpGRDfZ3c,514
232
234
  omlish/formats/cloudpickle.py,sha256=16si4yUp_pAdDWGECAWf6HLA2PwSANGGgDoMLGZUem8,579
@@ -262,7 +264,7 @@ omlish/formats/json/stream/errors.py,sha256=c8M8UAYmIZ-vWZLeKD2jMj4EDCJbr9QR8Jq_
262
264
  omlish/formats/json/stream/lex.py,sha256=ItsWvtl5SZH-HwQtPy8Cpf4nszqDzvUTdIOEmSRiZ-E,6807
263
265
  omlish/formats/json/stream/parse.py,sha256=JuYmXwtTHmQJTFKoJNoEHUpCPxXdl_gvKPykVXgED34,6208
264
266
  omlish/formats/json/stream/render.py,sha256=NtmDsN92xZi5dkgSSuMeMXMAiJblmjz1arB4Ft7vBhc,3715
265
- omlish/formats/json5/Json5.g4,sha256=fSUikG4-eK3j0Ugab9FzQZgpN3w0dN2gjSPWXmPcybI,2661
267
+ omlish/formats/json5/Json5.g4,sha256=ZUmgJPvj8lSMUD_v3wijp10ZQExYB5mu5Q089dYEJSU,2389
266
268
  omlish/formats/json5/__init__.py,sha256=BsjPz5zJDji3GjQ8x8hWvcl1GYPV_ZIHnE3c2Sr8aTU,102
267
269
  omlish/formats/json5/codec.py,sha256=ldnxCRo0JP1fkGLt0mMxJlLvNxqIF_1KUCcSp1HtI-M,452
268
270
  omlish/formats/json5/errors.py,sha256=AHkR9ySjAoQdUrizpqgL8fg0M5oe5mHZkml3KZHEvC4,38
@@ -299,7 +301,7 @@ omlish/http/consts.py,sha256=7BJ4D1MdIvqBcepkgCfBFHolgTwbOlqsOEiee_IjxOA,2289
299
301
  omlish/http/cookies.py,sha256=uuOYlHR6e2SC3GM41V0aozK10nef9tYg83Scqpn5-HM,6351
300
302
  omlish/http/dates.py,sha256=Otgp8wRxPgNGyzx8LFowu1vC4EKJYARCiAwLFncpfHM,2875
301
303
  omlish/http/encodings.py,sha256=w2WoKajpaZnQH8j-IBvk5ZFL2O2pAU_iBvZnkocaTlw,164
302
- omlish/http/handlers.py,sha256=2bKw7XRM11C0VSx-DStKa6exFKNINKK4jZ3uVUVh5d8,795
304
+ omlish/http/handlers.py,sha256=twe1VYYlIX0e_unFNtt5moU-VbtG29IuTu4RWS1vrn4,1052
303
305
  omlish/http/headers.py,sha256=ZMmjrEiYjzo0YTGyK0YsvjdwUazktGqzVVYorY4fd44,5081
304
306
  omlish/http/json.py,sha256=9XwAsl4966Mxrv-1ytyCqhcE6lbBJw-0_tFZzGszgHE,7440
305
307
  omlish/http/jwt.py,sha256=6Rigk1WrJ059DY4jDIKnxjnChWb7aFdermj2AI2DSvk,4346
@@ -311,7 +313,7 @@ omlish/http/versions.py,sha256=wSiOXPiClVjkVgSU_VmxkoD1SUYGaoPbP0U5Aw-Ufg8,409
311
313
  omlish/http/wsgi.py,sha256=czZsVUX-l2YTlMrUjKN49wRoP4rVpS0qpeBn4O5BoMY,948
312
314
  omlish/http/coro/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
313
315
  omlish/http/coro/fdio.py,sha256=ajj_lekRockGwQEw8m_mi6RO9-o6hnC9ITiwtZe3y-s,4017
314
- omlish/http/coro/server.py,sha256=-e-J5pPqPDGrvQkwcukwltOjTbTNatiCx9Rl7FvooTI,18071
316
+ omlish/http/coro/server.py,sha256=IhdBv-Cx09FG6ADNXfysJV6v7i1gU7dCHLx9Bt_BieM,18799
315
317
  omlish/inject/__init__.py,sha256=n0RC9UDGsBQQ39cST39-XJqJPq2M0tnnh9yJubW9azo,1891
316
318
  omlish/inject/binder.py,sha256=DAbc8TZi5w8Mna0TUtq0mT4jeDVA7i7SlBtOFrh2swc,4185
317
319
  omlish/inject/bindings.py,sha256=pLXn2U3kvmAS-68IOG-tr77DbiI-wp9hGyy4lhG6_H8,525
@@ -373,7 +375,7 @@ omlish/io/fdio/pollers.py,sha256=yNadAt3W5wd90PFmd3vD77bq5QwoVb2A6SM2JjZpKRs,550
373
375
  omlish/iterators/__init__.py,sha256=yMavf5FofiS1EU4UFuWPXiFZ03W0H-y7MuMxW8FUaEE,358
374
376
  omlish/iterators/iterators.py,sha256=ghI4dO6WPyyFOLTIIMaHQ_IOy2xXaFpGPqveZ5YGIBU,3158
375
377
  omlish/iterators/recipes.py,sha256=53mkexitMhkwXQZbL6DrhpT0WePQ_56uXd5Jaw3DfzI,467
376
- omlish/iterators/tools.py,sha256=SvXyyQJh7aceLYhRl6pQB-rfSaXw5IMIWukeEeOZt-0,2492
378
+ omlish/iterators/tools.py,sha256=Pi4ybXytUXVZ3xwK89xpPImQfYYId9p1vIFQvVqVLqA,2551
377
379
  omlish/iterators/unique.py,sha256=0jAX3kwzVfRNhe0Tmh7kVP_Q2WBIn8POo_O-rgFV0rQ,1390
378
380
  omlish/lang/__init__.py,sha256=sY7YSgN772n48qWlR-mwuOOCOwRF5Fh421gZqZWxYlw,4042
379
381
  omlish/lang/cached.py,sha256=92TvRZQ6sWlm7dNn4hgl7aWKbX0J1XUEo3DRjBpgVQk,7834
@@ -429,13 +431,15 @@ omlish/lite/types.py,sha256=fP5EMyBdEp2LmDxcHjUDtwAMdR06ISr9lKOL7smWfHM,140
429
431
  omlish/lite/typing.py,sha256=U3-JaEnkDSYxK4tsu_MzUn3RP6qALBe5FXQXpD-licE,1090
430
432
  omlish/logs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
431
433
  omlish/logs/abc.py,sha256=ho4ABKYMKX-V7g4sp1BByuOLzslYzLlQ0MESmjEpT-o,8005
432
- omlish/logs/all.py,sha256=4Z6cNB0E1xbX0IOQWZEWLA0Jw-yyjhXa3PD_Nvfewu8,556
434
+ omlish/logs/all.py,sha256=Er2NIcDvlMpuAcRr9b_uMHeoERU7I6lu5oLrDGRdV0U,728
435
+ omlish/logs/callers.py,sha256=W0BdEtuGkQ0JM-FCsXQIBQCsNUbIsbDrtCaJy9DStk4,1143
433
436
  omlish/logs/color.py,sha256=CM-ceoPXs0j5_klnZDJkFCFRgHOToFzJyLjC6LsnPEk,665
434
437
  omlish/logs/configs.py,sha256=XOc8rWxfPpPMxJESVD2mLCUoLtbQnGnZwvYhhqe7DD8,772
435
438
  omlish/logs/filters.py,sha256=2noFRyBez3y519fpfsDSt1vo8wX-85b8sMXZi5o_xyE,208
436
439
  omlish/logs/handlers.py,sha256=zgSnKQA5q9Fu7T0Nkd7twog9H1Wg9-bDCzz4_F1TOBo,319
437
440
  omlish/logs/json.py,sha256=zyqMWpZY3lk4WRk4wgmataBomGX9S3iDsydiM1sS-lI,1366
438
441
  omlish/logs/noisy.py,sha256=Ubc-eTH6ZbGYsLfUUi69JAotwuUwzb-SJBeGo_0dIZI,348
442
+ omlish/logs/protocol.py,sha256=NzyCeNBN-fyKpJinhECfjUQSd5MxZLiYbuLCTtW6QUU,4500
439
443
  omlish/logs/proxy.py,sha256=A-ROPUUAlF397qTbEqhel6YhQMstNuXL3Xmts7w9dAo,2347
440
444
  omlish/logs/standard.py,sha256=FbKdF2Z4Na5i2TNwKn0avLJXyICe2JKsPufjvKCHGn0,3162
441
445
  omlish/logs/utils.py,sha256=mzHrZ9ji75p5A8qR29eUr05CBAHMb8J753MSkID_VaQ,393
@@ -505,9 +509,14 @@ omlish/secrets/pwhash.py,sha256=Goktn-swmC6PXqfRBnDrH_Lr42vjckT712UyErPjzkw,4102
505
509
  omlish/secrets/secrets.py,sha256=cnDGBoPknVxsCN04_gqcJT_7Ebk3iO3VPkRZ2oMjkMw,7868
506
510
  omlish/secrets/subprocesses.py,sha256=ffjfbgPbEE_Pwb_87vG4yYR2CGZy3I31mHNCo_0JtHw,1212
507
511
  omlish/sockets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
508
- omlish/sockets/addresses.py,sha256=ZQFacDsXo6cKSgEjzN525IcUJPyfubXETzbY-_BBAro,1285
509
- omlish/sockets/handlers.py,sha256=9kkNMj1DTJa4xo_3hcBvSkjKc-dy_Ho5he2ubJieJ2A,621
510
- omlish/sockets/server.py,sha256=96vCNBvHSf8lWI3kd3RBbY0M2qXGaD_TksMhnBQ0_q0,1600
512
+ omlish/sockets/addresses.py,sha256=QGK-5smlg5owx3PEw9qSfSHQ5mkAYumUpbaVR4qvcpM,1442
513
+ omlish/sockets/bind.py,sha256=F5PATao0xUEoZ0unZbro2tPTECDtj1B6lS3ygEvIxUs,7750
514
+ omlish/sockets/handlers.py,sha256=cVMKG3dn_tJlz6aM0WUL1uQ03F7VQmmKn9yJlOwKE6g,226
515
+ omlish/sockets/io.py,sha256=lfhTkB7NnAIx9kuQhAkwgsEUXY78Mp1_WtYrIQNS_k8,1408
516
+ omlish/sockets/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
517
+ omlish/sockets/server/handlers.py,sha256=aoWZtDKPboHj3YAR-qHblnEGpz_Nx8mEajV_LxXUBRw,2440
518
+ omlish/sockets/server/server.py,sha256=ZLYjW_MmHfMGQ2qSMRFMKLwqPqGCCSf4ORiZjQd59MA,4144
519
+ omlish/sockets/server/threading.py,sha256=YmW3Ym_p5j_F4SIH9BgRHIObywjq1HS39j9CGWIcMAY,2856
511
520
  omlish/specs/__init__.py,sha256=zZwF8yXTEkSstYtORkDhVLK-_hWU8WOJCuBpognb_NY,118
512
521
  omlish/specs/jmespath/LICENSE,sha256=IH-ZZlZkS8XMkf_ubNVD1aYHQ2l_wd0tmHtXrCcYpRU,1113
513
522
  omlish/specs/jmespath/__init__.py,sha256=9tsrquw1kXe1KAhTP3WeL0GlGBiTguQVxsC-lUYTWP4,2087
@@ -628,9 +637,9 @@ omlish/text/indent.py,sha256=YjtJEBYWuk8--b9JU_T6q4yxV85_TR7VEVr5ViRCFwk,1336
628
637
  omlish/text/minja.py,sha256=jZC-fp3Xuhx48ppqsf2Sf1pHbC0t8XBB7UpUUoOk2Qw,5751
629
638
  omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
630
639
  omlish/text/random.py,sha256=jNWpqiaKjKyTdMXC-pWAsSC10AAP-cmRRPVhm59ZWLk,194
631
- omlish-0.0.0.dev217.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
632
- omlish-0.0.0.dev217.dist-info/METADATA,sha256=ej8P7o2EGJWFumDVus7JjRA14H1OZPQWWqQ_mB7vRhE,4176
633
- omlish-0.0.0.dev217.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
634
- omlish-0.0.0.dev217.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
635
- omlish-0.0.0.dev217.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
636
- omlish-0.0.0.dev217.dist-info/RECORD,,
640
+ omlish-0.0.0.dev218.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
641
+ omlish-0.0.0.dev218.dist-info/METADATA,sha256=-vMqTXr2Q_gjsOk2hxSEXQXb9eWwZ4vVabWD7mQjgD8,4176
642
+ omlish-0.0.0.dev218.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
643
+ omlish-0.0.0.dev218.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
644
+ omlish-0.0.0.dev218.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
645
+ omlish-0.0.0.dev218.dist-info/RECORD,,
omlish/docker/oci.py DELETED
@@ -1,81 +0,0 @@
1
- # ruff: noqa: UP006 UP007
2
- # @omlish-lite
3
- import dataclasses as dc
4
- import typing as ta
5
-
6
- from omlish.lite import marshal as msh
7
-
8
-
9
- @dc.dataclass(frozen=True)
10
- class OciImageIndex:
11
- """https://github.com/opencontainers/image-spec/blob/92353b0bee778725c617e7d57317b568a7796bd0/image-index.md"""
12
-
13
- @dc.dataclass(frozen=True)
14
- class Manifest:
15
- digest: str
16
- size: int
17
-
18
- #
19
-
20
- platform: ta.Optional[ta.Mapping[str, ta.Any]] = dc.field(default=None, metadata={msh.OBJ_MARSHALER_OMIT_IF_NONE: True}) # noqa
21
- annotations: ta.Optional[ta.Mapping[str, str]] = dc.field(default=None, metadata={msh.OBJ_MARSHALER_OMIT_IF_NONE: True}) # noqa
22
-
23
- #
24
-
25
- MEDIA_TYPE: ta.ClassVar[str] = 'application/vnd.oci.image.manifest.v1+json'
26
- media_type: str = dc.field(default=MEDIA_TYPE, metadata={msh.OBJ_MARSHALER_FIELD_KEY: 'mediaType'})
27
-
28
- manifests: ta.Sequence[Manifest]
29
-
30
- #
31
-
32
- annotations: ta.Optional[ta.Mapping[str, str]] = dc.field(default=None, metadata={msh.OBJ_MARSHALER_OMIT_IF_NONE: True}) # noqa
33
-
34
- #
35
-
36
- SCHEMA_VERSION: ta.ClassVar[int] = 2
37
- schema_version: int = dc.field(default=SCHEMA_VERSION, metadata={msh.OBJ_MARSHALER_FIELD_KEY: 'schemaVersion'})
38
-
39
- MEDIA_TYPE: ta.ClassVar[str] = 'application/vnd.oci.image.index.v1+json'
40
- media_type: str = dc.field(default=MEDIA_TYPE, metadata={msh.OBJ_MARSHALER_FIELD_KEY: 'mediaType'})
41
-
42
-
43
- @dc.dataclass(frozen=True)
44
- class OciImageManifest:
45
- """https://github.com/opencontainers/image-spec/blob/92353b0bee778725c617e7d57317b568a7796bd0/manifest.md"""
46
-
47
- @dc.dataclass(frozen=True)
48
- class Config:
49
- digest: str
50
- size: int
51
-
52
- #
53
-
54
- MEDIA_TYPE: ta.ClassVar[str] = 'application/vnd.oci.image.config.v1+json'
55
- media_type: str = dc.field(default=MEDIA_TYPE, metadata={msh.OBJ_MARSHALER_FIELD_KEY: 'mediaType'})
56
-
57
- config: Config
58
-
59
- @dc.dataclass(frozen=True)
60
- class Layer:
61
- digest: str
62
- size: int
63
-
64
- #
65
-
66
- MEDIA_TYPES: ta.ClassVar[ta.Mapping[str, str]] = {
67
- 'TAR': 'application/vnd.oci.image.layer.v1.tar',
68
- 'TAR_GZIP': 'application/vnd.oci.image.layer.v1.tar+gzip',
69
- 'TAR_ZSTD': 'application/vnd.oci.image.layer.v1.tar+zstd',
70
- }
71
- media_type: str = dc.field(default=MEDIA_TYPES['TAR'], metadata={msh.OBJ_MARSHALER_FIELD_KEY: 'mediaType'})
72
-
73
- layers: ta.Sequence[Layer]
74
-
75
- #
76
-
77
- SCHEMA_VERSION: ta.ClassVar[int] = 2
78
- schema_version: int = dc.field(default=SCHEMA_VERSION, metadata={msh.OBJ_MARSHALER_FIELD_KEY: 'schemaVersion'})
79
-
80
- MEDIA_TYPE: ta.ClassVar[str] = 'application/vnd.oci.image.manifest.v1+json'
81
- media_type: str = dc.field(default=MEDIA_TYPE, metadata={msh.OBJ_MARSHALER_FIELD_KEY: 'mediaType'})
omlish/sockets/server.py DELETED
@@ -1,66 +0,0 @@
1
- # ruff: noqa: UP006 UP007
2
- # @omlish-lite
3
- import socket
4
- import socketserver
5
- import typing as ta
6
-
7
- from ..lite.check import check
8
- from .addresses import SocketAddress
9
- from .handlers import SocketHandlerFactory
10
-
11
-
12
- ##
13
-
14
-
15
- class SocketServerBaseRequestHandler_: # noqa
16
- request: socket.socket
17
- client_address: SocketAddress
18
- server: socketserver.TCPServer
19
-
20
-
21
- class SocketServerStreamRequestHandler_(SocketServerBaseRequestHandler_): # noqa
22
- rbufsize: int
23
- wbufsize: int
24
-
25
- timeout: ta.Optional[float]
26
-
27
- disable_nagle_algorithm: bool
28
-
29
- connection: socket.socket
30
- rfile: ta.BinaryIO
31
- wfile: ta.BinaryIO
32
-
33
-
34
- ##
35
-
36
-
37
- class SocketHandlerSocketServerStreamRequestHandler( # type: ignore[misc]
38
- socketserver.StreamRequestHandler,
39
- SocketServerStreamRequestHandler_,
40
- ):
41
- socket_handler_factory: ta.Optional[SocketHandlerFactory] = None
42
-
43
- def __init__(
44
- self,
45
- request: socket.socket,
46
- client_address: SocketAddress,
47
- server: socketserver.TCPServer,
48
- *,
49
- socket_handler_factory: ta.Optional[SocketHandlerFactory] = None,
50
- ) -> None:
51
- if socket_handler_factory is not None:
52
- self.socket_handler_factory = socket_handler_factory
53
-
54
- super().__init__(
55
- request,
56
- client_address,
57
- server,
58
- )
59
-
60
- def handle(self) -> None:
61
- target = check.not_none(self.socket_handler_factory)(
62
- self.client_address,
63
- self.rfile, # type: ignore[arg-type]
64
- self.wfile, # type: ignore[arg-type]
65
- )
66
- target.handle()