omlish 0.0.0.dev220__py3-none-any.whl → 0.0.0.dev222__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. omlish/__about__.py +2 -2
  2. omlish/algorithm/all.py +13 -0
  3. omlish/algorithm/distribute.py +46 -0
  4. omlish/algorithm/toposort.py +26 -0
  5. omlish/algorithm/unify.py +31 -0
  6. omlish/collections/__init__.py +0 -2
  7. omlish/collections/utils.py +0 -46
  8. omlish/graphs/trees.py +2 -1
  9. omlish/http/coro/server.py +42 -33
  10. omlish/http/{simple.py → coro/simple.py} +17 -17
  11. omlish/specs/irc/__init__.py +0 -0
  12. omlish/specs/irc/format/LICENSE +11 -0
  13. omlish/specs/irc/format/__init__.py +61 -0
  14. omlish/specs/irc/format/consts.py +6 -0
  15. omlish/specs/irc/format/errors.py +30 -0
  16. omlish/specs/irc/format/message.py +18 -0
  17. omlish/specs/irc/format/nuh.py +52 -0
  18. omlish/specs/irc/format/parsing.py +155 -0
  19. omlish/specs/irc/format/rendering.py +150 -0
  20. omlish/specs/irc/format/tags.py +99 -0
  21. omlish/specs/irc/format/utils.py +27 -0
  22. omlish/specs/irc/numerics/__init__.py +0 -0
  23. omlish/specs/irc/numerics/formats.py +94 -0
  24. omlish/specs/irc/numerics/numerics.py +808 -0
  25. omlish/specs/irc/numerics/types.py +59 -0
  26. {omlish-0.0.0.dev220.dist-info → omlish-0.0.0.dev222.dist-info}/METADATA +1 -1
  27. {omlish-0.0.0.dev220.dist-info → omlish-0.0.0.dev222.dist-info}/RECORD +32 -15
  28. omlish/docker/oci/data.py +0 -71
  29. omlish/docker/oci/media.py +0 -124
  30. /omlish/{docker/oci → algorithm}/__init__.py +0 -0
  31. {omlish-0.0.0.dev220.dist-info → omlish-0.0.0.dev222.dist-info}/LICENSE +0 -0
  32. {omlish-0.0.0.dev220.dist-info → omlish-0.0.0.dev222.dist-info}/WHEEL +0 -0
  33. {omlish-0.0.0.dev220.dist-info → omlish-0.0.0.dev222.dist-info}/entry_points.txt +0 -0
  34. {omlish-0.0.0.dev220.dist-info → omlish-0.0.0.dev222.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,59 @@
1
+ import dataclasses as dc
2
+ import typing as ta
3
+
4
+ from .... import collections as col
5
+
6
+
7
+ ##
8
+
9
+
10
+ @dc.dataclass(frozen=True)
11
+ class NumericReply:
12
+ name: str
13
+ num: int
14
+ formats: ta.Sequence[str]
15
+
16
+ @classmethod
17
+ def new(
18
+ cls,
19
+ name: str,
20
+ num: int,
21
+ *formats: str,
22
+ ) -> 'NumericReply':
23
+ return cls(
24
+ name,
25
+ num,
26
+ formats,
27
+ )
28
+
29
+
30
+ ##
31
+
32
+
33
+ class NumericReplies:
34
+ def __init__(self, lst: ta.Iterable[NumericReply]) -> None:
35
+ super().__init__()
36
+
37
+ self._lst = list(lst)
38
+ self._by_name = col.make_map_by(lambda nr: nr.name, self._lst, strict=True)
39
+ self._by_num = col.make_map_by(lambda nr: nr.num, self._lst, strict=True)
40
+
41
+ def __len__(self) -> int:
42
+ return len(self._lst)
43
+
44
+ def __iter__(self) -> ta.Iterator[NumericReply]:
45
+ return iter(self._lst)
46
+
47
+ def __getitem__(self, key: str | int) -> NumericReply:
48
+ if isinstance(key, str):
49
+ return self._by_name[key]
50
+ elif isinstance(key, int):
51
+ return self._by_num[key]
52
+ else:
53
+ raise TypeError(key)
54
+
55
+ def get(self, key: str | int) -> NumericReply | None:
56
+ try:
57
+ return self[key]
58
+ except KeyError:
59
+ return None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: omlish
3
- Version: 0.0.0.dev220
3
+ Version: 0.0.0.dev222
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=4MxdtmyseRyrqsGb-8ZzKRlrqSzhp5cQ5hkCmiaDCZc,3380
2
+ omlish/__about__.py,sha256=qi9D_c4g4GLU0jkkVIC7_HYbKv2ZTrFCeMEs9eP0aPU,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
@@ -13,6 +13,11 @@ omlish/runmodule.py,sha256=PWvuAaJ9wQQn6bx9ftEL3_d04DyotNn8dR_twm2pgw0,700
13
13
  omlish/shlex.py,sha256=bsW2XUD8GiMTUTDefJejZ5AyqT1pTgWMPD0BMoF02jE,248
14
14
  omlish/subprocesses.py,sha256=c7arxsQ7JiaNCmK3GKqwRO6BwrvxeK7eez8A4SrvGBo,10199
15
15
  omlish/sync.py,sha256=QJ79kxmIqDP9SeHDoZAf--DpFIhDQe1jACy8H4N0yZI,2928
16
+ omlish/algorithm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
+ omlish/algorithm/all.py,sha256=FudUHwoaRLNNmqYM3jhP2Yd2BpmYhNBRPaVZzARMoSc,194
18
+ omlish/algorithm/distribute.py,sha256=kO60F7HtMF3j-IxuhJdtsfgIR1Vpf1okQfacb4eNukQ,1533
19
+ omlish/algorithm/toposort.py,sha256=cE-zouEVhX05jwGl86JhxB2qgqw5DfQRqpZFR89j7NY,888
20
+ omlish/algorithm/unify.py,sha256=xUvisdtU8L9uMWt--_osYksJjVBlwxLOLvtdDmFGDDo,833
16
21
  omlish/antlr/__init__.py,sha256=88bMl_28cfSKslgOkMGYXqALgsHz3KC4LFvAVtzj7k8,89
17
22
  omlish/antlr/delimit.py,sha256=3Byvh9_Ip8ftM_SeSEmMbnNo1jrxk-xm8HnHDp_nDaI,3466
18
23
  omlish/antlr/dot.py,sha256=W9cgprtAZH6EjUkzWfSbx2XUUYRYLLxFofGWrUp-368,956
@@ -130,7 +135,7 @@ omlish/codecs/funcs.py,sha256=p4imNt7TobyZVXWC-WhntHVu9KfJrO4QwdtPRh-cVOk,850
130
135
  omlish/codecs/registry.py,sha256=Ald3fs707cJsUovYjNmxdT2zAQworvDxwMFk7DBT8r0,3995
131
136
  omlish/codecs/standard.py,sha256=eiZ4u9ep0XrA4Z_D1zJI0vmWyuN8HLrX4Se_r_Cq_ZM,60
132
137
  omlish/codecs/text.py,sha256=JzrdwMpQPo2NBBg3K1EZszzQy5vEWmd82SIerJd4yeQ,5723
133
- omlish/collections/__init__.py,sha256=zeUvcAz073ekko37QKya6sElTMfKTuF1bKrdbMtaRpI,2142
138
+ omlish/collections/__init__.py,sha256=I-HDYNL1EF7vx-M3wMk5cTdX-lA4EnZtBF5wcd7Qbhg,2110
134
139
  omlish/collections/abc.py,sha256=sP7BpTVhx6s6C59mTFeosBi4rHOWC6tbFBYbxdZmvh0,2365
135
140
  omlish/collections/coerce.py,sha256=g68ROb_-5HgH-vI8612mU2S0FZ8-wp2ZHK5_Zy_kVC0,7037
136
141
  omlish/collections/exceptions.py,sha256=shcS-NCnEUudF8qC_SmO2TQyjivKlS4TDjaz_faqQ0c,44
@@ -146,7 +151,7 @@ omlish/collections/sorted.py,sha256=E5ZOdNn7Jju1EcQ7CX2Ltk9StIXsBOzqvh7EsT3ZA2U,
146
151
  omlish/collections/treap.py,sha256=A09ZPacGyJlyRB-Wi4TNj3tE0w-RpFNliPgpDaa6Vwg,7719
147
152
  omlish/collections/treapmap.py,sha256=TxOM-ZRF5PK2xe5wRIhESNt7DGh9b_MeZfE7HLkCOs4,5804
148
153
  omlish/collections/unmodifiable.py,sha256=QmUEi9IBXqiM_KGgH2rqg15VmkHJo1MZ6kwq2twEMho,4750
149
- omlish/collections/utils.py,sha256=9o9STwzAn5YjZRZ9ns1kuo7NgLXLaoVPFu6AJd-3JT8,4336
154
+ omlish/collections/utils.py,sha256=Q0lHhNDokVxdOvApmu1QX5fABYwbn1ATiIwp194Ur_E,2889
150
155
  omlish/collections/cache/__init__.py,sha256=D1gO71VcwxFTZP9gAc9isHfg_TEdalwhsJcgGLvS9hg,233
151
156
  omlish/collections/cache/descriptor.py,sha256=t-1Gh4DTABDuNmeDJlpoW4LV3gi_uSlBd9ZfBINfYCM,5023
152
157
  omlish/collections/cache/impl.py,sha256=ySRU9UJG7jH9VPvuXdwZQ_rSqrleY-1mtie5Ml738wY,14755
@@ -227,9 +232,6 @@ omlish/docker/hub.py,sha256=7LIuJGdA-N1Y1dmo50ynKM1KUTcnQM_5XbtPbdT_QLU,3940
227
232
  omlish/docker/manifests.py,sha256=LR4FpOGNUT3bZQ-gTjB6r_-1C3YiG30QvevZjrsVUQM,7068
228
233
  omlish/docker/portrelay.py,sha256=QlRoTnQXs5INguR7XOj1xH0gNdL9SUeZm5z45DUctXo,1222
229
234
  omlish/docker/timebomb.py,sha256=A_pgIDaXKsQwPiikrCTgIJl91gwYqkPGFY6j-Naq07Q,342
230
- omlish/docker/oci/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
231
- omlish/docker/oci/data.py,sha256=4KtSxziT70BhF30ozQ1SCfX4y0LT_5x0CuOKC4zrEV4,2616
232
- omlish/docker/oci/media.py,sha256=fJ8VcU-edDpg-FyJQamw-sUlhTghkC-WQ1TC4MiRpFU,4499
233
235
  omlish/formats/__init__.py,sha256=T0AG1gFnqQ5JiHN0UPQjQ-7g5tnxMIG-mgOvMYExYAM,21
234
236
  omlish/formats/cbor.py,sha256=o_Hbe4kthO9CeXK-FySrw0dHVlrdyTo2Y8PpGRDfZ3c,514
235
237
  omlish/formats/cloudpickle.py,sha256=16si4yUp_pAdDWGECAWf6HLA2PwSANGGgDoMLGZUem8,579
@@ -288,7 +290,7 @@ omlish/funcs/pipes.py,sha256=E7Sz8Aj8ke_vCs5AMNwg1I36kRdHVGTnzxVQaDyn43U,2490
288
290
  omlish/graphs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
289
291
  omlish/graphs/dags.py,sha256=zp55lYgUdRCxmADwiGDHeehMJczZFA_tzdWqy77icOk,3047
290
292
  omlish/graphs/domination.py,sha256=oCGoWzWTxLwow0LDyGjjEf2AjFiOiDz4WaBtczwSbsQ,7576
291
- omlish/graphs/trees.py,sha256=t9kzLy33ynYV0TowVkyDvkkRBQV5x--1vtNBSB4Auus,8156
293
+ omlish/graphs/trees.py,sha256=zvfjDN8R7J6wStNJEUO6OCioGXJrLGhU8KtcqlWVRPI,8191
292
294
  omlish/graphs/dot/__init__.py,sha256=Y1MZRQBZkcYyG1Tn7K2FhL8aYbm4v4tk6f5g9AqEkUw,359
293
295
  omlish/graphs/dot/items.py,sha256=OWPf0-hjBgS1uyy2QgAEn4IgFHJcEg7sHVWeTx1ghZc,4083
294
296
  omlish/graphs/dot/make.py,sha256=RN30gHfJPiXx5Q51kbDdhVJYf59Fr84Lz9J-mXRt9sI,360
@@ -309,13 +311,13 @@ omlish/http/jwt.py,sha256=6Rigk1WrJ059DY4jDIKnxjnChWb7aFdermj2AI2DSvk,4346
309
311
  omlish/http/multipart.py,sha256=R9ycpHsXRcmh0uoc43aYb7BdWL-8kSQHe7J-M81aQZM,2240
310
312
  omlish/http/parsing.py,sha256=hxfd9nYaAAjYIivkTClFZXMRmiiCnxzeeEIGXw7-gt0,13992
311
313
  omlish/http/sessions.py,sha256=TfTJ_j-6c9PelG_RmijEwozfaVm3O7YzgtFvp8VzQqM,4799
312
- omlish/http/simple.py,sha256=9WtpbQahiZE-UjRP3ZDni8DQTq_HkVSdwpui_y8mf1I,2867
313
314
  omlish/http/sse.py,sha256=MDs9RvxQXoQliImcc6qK1ERajEYM7Q1l8xmr-9ceNBc,2315
314
315
  omlish/http/versions.py,sha256=wSiOXPiClVjkVgSU_VmxkoD1SUYGaoPbP0U5Aw-Ufg8,409
315
316
  omlish/http/wsgi.py,sha256=czZsVUX-l2YTlMrUjKN49wRoP4rVpS0qpeBn4O5BoMY,948
316
317
  omlish/http/coro/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
317
318
  omlish/http/coro/fdio.py,sha256=ajj_lekRockGwQEw8m_mi6RO9-o6hnC9ITiwtZe3y-s,4017
318
- omlish/http/coro/server.py,sha256=TgqBTOpniZMqRPoSP3xrAaD-TLSoPsknVr7D22-2zgo,19432
319
+ omlish/http/coro/server.py,sha256=q5HlGMXNrKBRMoHSNFcqsQL1GEVyjoMC8GgRMbdJ96s,19648
320
+ omlish/http/coro/simple.py,sha256=Y1wJGAfdr0qz3gGpqpdpigbtquFUdksQi2dQGu8K1Z0,2872
319
321
  omlish/inject/__init__.py,sha256=n0RC9UDGsBQQ39cST39-XJqJPq2M0tnnh9yJubW9azo,1891
320
322
  omlish/inject/binder.py,sha256=DAbc8TZi5w8Mna0TUtq0mT4jeDVA7i7SlBtOFrh2swc,4185
321
323
  omlish/inject/bindings.py,sha256=pLXn2U3kvmAS-68IOG-tr77DbiI-wp9hGyy4lhG6_H8,525
@@ -524,6 +526,21 @@ omlish/sockets/server/handlers.py,sha256=-5lH2Xg7gnZiPB4t2Asa_Vgblj1ZkHzLvyiC_K4
524
526
  omlish/sockets/server/server.py,sha256=mZmHPkCRPitous56_7FJdAsDLZag2wDqjj-LaYM8_Fg,4943
525
527
  omlish/sockets/server/threading.py,sha256=YmW3Ym_p5j_F4SIH9BgRHIObywjq1HS39j9CGWIcMAY,2856
526
528
  omlish/specs/__init__.py,sha256=zZwF8yXTEkSstYtORkDhVLK-_hWU8WOJCuBpognb_NY,118
529
+ omlish/specs/irc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
530
+ omlish/specs/irc/format/LICENSE,sha256=1CT5_XkDMJ9HDZh0tX4TIsm7LfrSdljRX5EirPBhDYM,778
531
+ omlish/specs/irc/format/__init__.py,sha256=0OFSLrMS5jYFJCqH1LKv0UfTrp5faPQhlhYKBQyCZeA,1701
532
+ omlish/specs/irc/format/consts.py,sha256=iDCsJIyDE5-UnkIQpwCLzdbf3DUFWRmqkuVd0cZtujw,185
533
+ omlish/specs/irc/format/errors.py,sha256=cRP8c--kRts5Uwqn1xl1J97OI74hicG4UbkJs_EOSDg,334
534
+ omlish/specs/irc/format/message.py,sha256=SQP7IpdlxCncALiBD_01TxxOjQsBxbmLE0hxLB2Q0vU,398
535
+ omlish/specs/irc/format/nuh.py,sha256=96KJooCzdlmbliyLpoE8g4ccDSHzR0Fl1apu7gkExEQ,1282
536
+ omlish/specs/irc/format/parsing.py,sha256=OYSk7IbaZPpU5k1mRn-3reROPVehwyRAJs546vnEXI4,4053
537
+ omlish/specs/irc/format/rendering.py,sha256=PDhl5dIU9xffmIO3vHWTPh17Cb-E34vIkFLs-Ow3tmY,4909
538
+ omlish/specs/irc/format/tags.py,sha256=_HnzjPCGhLses_P3Os5ReuVdRacmanTb8kEeCxsfqWE,2779
539
+ omlish/specs/irc/format/utils.py,sha256=8VZavx37IospJvhwjnP39sYSiBwzcxNyCJ_doxrtM-Y,687
540
+ omlish/specs/irc/numerics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
541
+ omlish/specs/irc/numerics/formats.py,sha256=n--9bxFkY3p8G1K3aJJXj7FEK_tmGouBrB8Gu1WrEd0,2252
542
+ omlish/specs/irc/numerics/numerics.py,sha256=re5eKU4xoTJgFrNr3VPHS-WvaexAHJLoxvWnnMty_O0,16677
543
+ omlish/specs/irc/numerics/types.py,sha256=qbNDLxtz827JnIMh79-SGK1RdbEy44vZl6uQMIYGXyg,1287
527
544
  omlish/specs/jmespath/LICENSE,sha256=IH-ZZlZkS8XMkf_ubNVD1aYHQ2l_wd0tmHtXrCcYpRU,1113
528
545
  omlish/specs/jmespath/__init__.py,sha256=9tsrquw1kXe1KAhTP3WeL0GlGBiTguQVxsC-lUYTWP4,2087
529
546
  omlish/specs/jmespath/__main__.py,sha256=wIXm6bs08etNG_GZlN2rBkADPb0rKfL2HSkm8spnpxw,200
@@ -643,9 +660,9 @@ omlish/text/indent.py,sha256=YjtJEBYWuk8--b9JU_T6q4yxV85_TR7VEVr5ViRCFwk,1336
643
660
  omlish/text/minja.py,sha256=jZC-fp3Xuhx48ppqsf2Sf1pHbC0t8XBB7UpUUoOk2Qw,5751
644
661
  omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
645
662
  omlish/text/random.py,sha256=jNWpqiaKjKyTdMXC-pWAsSC10AAP-cmRRPVhm59ZWLk,194
646
- omlish-0.0.0.dev220.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
647
- omlish-0.0.0.dev220.dist-info/METADATA,sha256=ipY89eJtdtOxzaJVqRlOxyjn-VVMv0fWU7P7qXeJo1Q,4176
648
- omlish-0.0.0.dev220.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
649
- omlish-0.0.0.dev220.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
650
- omlish-0.0.0.dev220.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
651
- omlish-0.0.0.dev220.dist-info/RECORD,,
663
+ omlish-0.0.0.dev222.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
664
+ omlish-0.0.0.dev222.dist-info/METADATA,sha256=ij9bc4yyi5znMyYrn-XGpDpGokENDlDacgDAjOeyUFI,4176
665
+ omlish-0.0.0.dev222.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
666
+ omlish-0.0.0.dev222.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
667
+ omlish-0.0.0.dev222.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
668
+ omlish-0.0.0.dev222.dist-info/RECORD,,
omlish/docker/oci/data.py DELETED
@@ -1,71 +0,0 @@
1
- # ruff: noqa: UP006 UP007
2
- # @omlish-lite
3
- import abc
4
- import dataclasses as dc
5
- import typing as ta
6
-
7
- from ...lite.marshal import OBJ_MARSHALER_FIELD_KEY
8
- from ...lite.marshal import OBJ_MARSHALER_OMIT_IF_NONE
9
-
10
-
11
- ##
12
-
13
-
14
- @dc.dataclass(frozen=True)
15
- class OciDataclass(abc.ABC): # noqa
16
- pass
17
-
18
-
19
- ##
20
-
21
-
22
- @dc.dataclass(frozen=True)
23
- class OciImageConfig(OciDataclass):
24
- """https://github.com/opencontainers/image-spec/blob/92353b0bee778725c617e7d57317b568a7796bd0/config.md"""
25
-
26
- architecture: str
27
- os: str
28
-
29
- @dc.dataclass(frozen=True)
30
- class RootFs:
31
- type: str
32
- diff_ids: ta.Sequence[str]
33
-
34
- rootfs: RootFs
35
-
36
- #
37
-
38
- created: ta.Optional[str] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True})
39
- author: ta.Optional[str] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True})
40
- os_version: ta.Optional[str] = dc.field(default=None, metadata={OBJ_MARSHALER_FIELD_KEY: 'os.version', OBJ_MARSHALER_OMIT_IF_NONE: True}) # noqa
41
- os_features: ta.Optional[ta.Sequence[str]] = dc.field(default=None, metadata={OBJ_MARSHALER_FIELD_KEY: 'os.features', OBJ_MARSHALER_OMIT_IF_NONE: True}) # noqa
42
- variant: ta.Optional[str] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True})
43
-
44
- """
45
- config object, OPTIONAL
46
- User string, OPTIONAL
47
- ExposedPorts object, OPTIONAL
48
- Env array of strings, OPTIONAL
49
- Entrypoint array of strings, OPTIONAL
50
- Cmd array of strings, OPTIONAL
51
- Volumes object, OPTIONAL
52
- WorkingDir string, OPTIONAL
53
- Labels object, OPTIONAL
54
- StopSignal string, OPTIONAL
55
- ArgsEscaped boolean, OPTIONAL
56
- Memory integer, OPTIONAL
57
- MemorySwap integer, OPTIONAL
58
- CpuShares integer, OPTIONAL
59
- Healthcheck object, OPTIONAL
60
- """
61
- config: ta.Optional[ta.Mapping[str, ta.Any]] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True})
62
-
63
- @dc.dataclass(frozen=True)
64
- class History:
65
- created: ta.Optional[str] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True})
66
- author: ta.Optional[str] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True})
67
- created_by: ta.Optional[str] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True})
68
- comment: ta.Optional[str] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True})
69
- empty_layer: ta.Optional[bool] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True})
70
-
71
- history: ta.Optional[ta.Sequence[History]] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True})
@@ -1,124 +0,0 @@
1
- # ruff: noqa: UP006 UP007
2
- # @omlish-lite
3
- import abc
4
- import dataclasses as dc
5
- import typing as ta
6
-
7
- from ...lite.check import check
8
- from ...lite.marshal import OBJ_MARSHALER_FIELD_KEY
9
- from ...lite.marshal import OBJ_MARSHALER_OMIT_IF_NONE
10
- from ...lite.marshal import unmarshal_obj
11
- from .data import OciDataclass
12
- from .data import OciImageConfig
13
-
14
-
15
- ##
16
-
17
-
18
- @dc.dataclass(frozen=True)
19
- class OciMediaDataclass(OciDataclass, abc.ABC): # noqa
20
- SCHEMA_VERSION: ta.ClassVar[int]
21
- MEDIA_TYPE: ta.ClassVar[str]
22
-
23
-
24
- _REGISTERED_OCI_MEDIA_DATACLASSES: ta.Dict[str, ta.Type[OciMediaDataclass]] = {}
25
-
26
-
27
- def _register_oci_media_dataclass(cls):
28
- check.issubclass(cls, OciMediaDataclass)
29
- check.arg(dc.is_dataclass(cls))
30
- mt = check.non_empty_str(cls.__dict__['MEDIA_TYPE'])
31
- check.not_in(mt, _REGISTERED_OCI_MEDIA_DATACLASSES)
32
- _REGISTERED_OCI_MEDIA_DATACLASSES[mt] = cls
33
- return cls
34
-
35
-
36
- def get_registered_oci_media_dataclass(media_type: str) -> ta.Optional[ta.Type[OciMediaDataclass]]:
37
- return _REGISTERED_OCI_MEDIA_DATACLASSES.get(media_type)
38
-
39
-
40
- def unmarshal_oci_media_dataclass(
41
- dct: ta.Mapping[str, ta.Any],
42
- *,
43
- media_type: ta.Optional[str] = None,
44
- ) -> ta.Any:
45
- if media_type is None:
46
- media_type = check.non_empty_str(dct['mediaType'])
47
- cls = _REGISTERED_OCI_MEDIA_DATACLASSES[media_type]
48
- return unmarshal_obj(dct, cls)
49
-
50
-
51
- #
52
-
53
-
54
- @dc.dataclass(frozen=True)
55
- class OciMediaDescriptor(OciDataclass):
56
- """https://github.com/opencontainers/image-spec/blob/92353b0bee778725c617e7d57317b568a7796bd0/descriptor.md#properties""" # noqa
57
-
58
- media_type: str = dc.field(metadata={OBJ_MARSHALER_FIELD_KEY: 'mediaType'})
59
- digest: str
60
- size: int
61
-
62
- #
63
-
64
- urls: ta.Optional[ta.Sequence[str]] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True})
65
- annotations: ta.Optional[ta.Mapping[str, str]] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True}) # noqa
66
- data: ta.Optional[str] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True})
67
- artifact_type: ta.Optional[str] = dc.field(default=None, metadata={OBJ_MARSHALER_FIELD_KEY: 'artifactType', OBJ_MARSHALER_OMIT_IF_NONE: True}) # noqa
68
-
69
- #
70
-
71
- platform: ta.Optional[ta.Mapping[str, ta.Any]] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True}) # noqa
72
-
73
-
74
- @_register_oci_media_dataclass
75
- @dc.dataclass(frozen=True)
76
- class OciMediaImageIndex(OciMediaDataclass):
77
- """https://github.com/opencontainers/image-spec/blob/92353b0bee778725c617e7d57317b568a7796bd0/image-index.md"""
78
-
79
- manifests: ta.Sequence[OciMediaDescriptor] # -> OciMediaImageIndex | OciMediaImageManifest
80
-
81
- #
82
-
83
- annotations: ta.Optional[ta.Mapping[str, str]] = dc.field(default=None, metadata={OBJ_MARSHALER_OMIT_IF_NONE: True}) # noqa
84
-
85
- #
86
-
87
- SCHEMA_VERSION: ta.ClassVar[int] = 2
88
- schema_version: int = dc.field(default=SCHEMA_VERSION, metadata={OBJ_MARSHALER_FIELD_KEY: 'schemaVersion'})
89
-
90
- MEDIA_TYPE: ta.ClassVar[str] = 'application/vnd.oci.image.index.v1+json'
91
- media_type: str = dc.field(default=MEDIA_TYPE, metadata={OBJ_MARSHALER_FIELD_KEY: 'mediaType'})
92
-
93
-
94
- @_register_oci_media_dataclass
95
- @dc.dataclass(frozen=True)
96
- class OciMediaImageManifest(OciMediaDataclass):
97
- """https://github.com/opencontainers/image-spec/blob/92353b0bee778725c617e7d57317b568a7796bd0/manifest.md"""
98
-
99
- config: OciMediaDescriptor # -> OciMediaImageConfig
100
-
101
- # MEDIA_TYPES: ta.ClassVar[ta.Mapping[str, str]] = {
102
- # 'TAR': 'application/vnd.oci.image.layer.v1.tar',
103
- # 'TAR_GZIP': 'application/vnd.oci.image.layer.v1.tar+gzip',
104
- # 'TAR_ZSTD': 'application/vnd.oci.image.layer.v1.tar+zstd',
105
- # }
106
- layers: ta.Sequence[OciMediaDescriptor]
107
-
108
- #
109
-
110
- SCHEMA_VERSION: ta.ClassVar[int] = 2
111
- schema_version: int = dc.field(default=SCHEMA_VERSION, metadata={OBJ_MARSHALER_FIELD_KEY: 'schemaVersion'})
112
-
113
- MEDIA_TYPE: ta.ClassVar[str] = 'application/vnd.oci.image.manifest.v1+json'
114
- media_type: str = dc.field(default=MEDIA_TYPE, metadata={OBJ_MARSHALER_FIELD_KEY: 'mediaType'})
115
-
116
-
117
- @_register_oci_media_dataclass
118
- @dc.dataclass(frozen=True)
119
- class OciMediaImageConfig(OciImageConfig, OciMediaDataclass):
120
- SCHEMA_VERSION: ta.ClassVar[int] = 2
121
- schema_version: int = dc.field(default=SCHEMA_VERSION, metadata={OBJ_MARSHALER_FIELD_KEY: 'schemaVersion'})
122
-
123
- MEDIA_TYPE: ta.ClassVar[str] = 'application/vnd.oci.image.config.v1+json'
124
- media_type: str = dc.field(default=MEDIA_TYPE, metadata={OBJ_MARSHALER_FIELD_KEY: 'mediaType'})
File without changes