omdev 0.0.0.dev62__py3-none-any.whl → 0.0.0.dev64__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.

Potentially problematic release.


This version of omdev might be problematic. Click here for more details.

@@ -3033,29 +3033,30 @@ def register_opj_marshaler(ty: ta.Any, m: ObjMarshaler) -> None:
3033
3033
 
3034
3034
 
3035
3035
  def _make_obj_marshaler(ty: ta.Any) -> ObjMarshaler:
3036
- if isinstance(ty, type) and abc.ABC in ty.__bases__:
3037
- impls = [ # type: ignore
3038
- PolymorphicObjMarshaler.Impl(
3039
- ity,
3040
- ity.__qualname__,
3041
- get_obj_marshaler(ity),
3036
+ if isinstance(ty, type):
3037
+ if abc.ABC in ty.__bases__:
3038
+ impls = [ # type: ignore
3039
+ PolymorphicObjMarshaler.Impl(
3040
+ ity,
3041
+ ity.__qualname__,
3042
+ get_obj_marshaler(ity),
3043
+ )
3044
+ for ity in deep_subclasses(ty)
3045
+ if abc.ABC not in ity.__bases__
3046
+ ]
3047
+ return PolymorphicObjMarshaler(
3048
+ {i.ty: i for i in impls},
3049
+ {i.tag: i for i in impls},
3042
3050
  )
3043
- for ity in deep_subclasses(ty)
3044
- if abc.ABC not in ity.__bases__
3045
- ]
3046
- return PolymorphicObjMarshaler(
3047
- {i.ty: i for i in impls},
3048
- {i.tag: i for i in impls},
3049
- )
3050
3051
 
3051
- if isinstance(ty, type) and issubclass(ty, enum.Enum):
3052
- return EnumObjMarshaler(ty)
3052
+ if issubclass(ty, enum.Enum):
3053
+ return EnumObjMarshaler(ty)
3053
3054
 
3054
- if dc.is_dataclass(ty):
3055
- return DataclassObjMarshaler(
3056
- ty,
3057
- {f.name: get_obj_marshaler(f.type) for f in dc.fields(ty)},
3058
- )
3055
+ if dc.is_dataclass(ty):
3056
+ return DataclassObjMarshaler(
3057
+ ty,
3058
+ {f.name: get_obj_marshaler(f.type) for f in dc.fields(ty)},
3059
+ )
3059
3060
 
3060
3061
  if is_generic_alias(ty):
3061
3062
  try:
@@ -10,8 +10,11 @@ import typing as ta
10
10
 
11
11
  from omlish import argparse as ap
12
12
  from omlish import check
13
+ from omlish import docker as dck
13
14
  from omlish import lang
14
15
  from omlish import logs
16
+ from omlish import marshal as msh
17
+ from omlish.formats import json
15
18
  from omlish.formats import yaml
16
19
 
17
20
  from ..cli import CliModule
@@ -179,6 +182,56 @@ class Cli(ap.Cli):
179
182
  with open(yml_file, 'w') as f:
180
183
  f.write(new_src)
181
184
 
185
+ @ap.command(
186
+ ap.arg('repo'),
187
+ ap.arg('tags', nargs='*'),
188
+ )
189
+ def repo_info(self) -> int:
190
+ if (info := dck.get_hub_repo_info(self.args.repo, tags=self.args.tags or None)) is None:
191
+ return 1
192
+ print(json.dumps_pretty(msh.marshal(info)))
193
+ return 0
194
+
195
+ @ap.command(
196
+ ap.arg('image'),
197
+ )
198
+ def repo_latest_image(self) -> int:
199
+ if ':' in self.args.image:
200
+ repo, _, base = self.args.image.partition(':')
201
+ else:
202
+ repo, base = self.args.image, None
203
+ if (info := dck.get_hub_repo_info(repo)) is None:
204
+ return 1
205
+ print(dck.select_latest_tag(info.tags, base=base))
206
+ return 0
207
+
208
+ @ap.command(
209
+ ap.arg('-f', '--file'),
210
+ )
211
+ def compose_image_updates(self) -> None:
212
+ if self.args.file:
213
+ yml_file = self.args.file
214
+ else:
215
+ yml_file = os.path.join('docker', 'compose.yml')
216
+
217
+ with open(yml_file) as f:
218
+ yml_src = f.read()
219
+
220
+ cfg_dct = yaml.safe_load(yml_src)
221
+ for svc_name, svc_dct in cfg_dct.get('services', {}).items():
222
+ if not (img := svc_dct.get('image')):
223
+ continue
224
+
225
+ repo, _, base = img.partition(':')
226
+ if (info := dck.get_hub_repo_info(repo)) is None:
227
+ continue
228
+
229
+ lt = dck.select_latest_tag(info.tags, base=base)
230
+ if f'{repo}:{lt}' == img:
231
+ continue
232
+
233
+ print(f'{svc_name}: {lt}')
234
+
182
235
 
183
236
  # @omlish-manifest
184
237
  _CLI_MODULE = CliModule('docker', __name__)
@@ -186,4 +239,4 @@ _CLI_MODULE = CliModule('docker', __name__)
186
239
 
187
240
  if __name__ == '__main__':
188
241
  logs.configure_standard_logging('INFO')
189
- Cli()()
242
+ Cli().call_and_exit()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omdev
3
- Version: 0.0.0.dev62
3
+ Version: 0.0.0.dev64
4
4
  Summary: omdev
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -12,7 +12,7 @@ Classifier: Operating System :: OS Independent
12
12
  Classifier: Operating System :: POSIX
13
13
  Requires-Python: ~=3.12
14
14
  License-File: LICENSE
15
- Requires-Dist: omlish ==0.0.0.dev62
15
+ Requires-Dist: omlish ==0.0.0.dev64
16
16
  Provides-Extra: all
17
17
  Requires-Dist: pycparser ~=2.22 ; extra == 'all'
18
18
  Requires-Dist: cffi ~=1.17 ; extra == 'all'
@@ -1,4 +1,4 @@
1
- omdev/.manifests.json,sha256=cFtziwWnzyiOPhVOkivx6peBOopFr4Umfqz1NTK9M_Y,4476
1
+ omdev/.manifests.json,sha256=-soVkIwt6YB1DbsxaHqGNe4N46stWaTqT6Z18vb-CiU,4476
2
2
  omdev/__about__.py,sha256=LqSNNFFcT84xW3W8fIOJ78kPYJKFLIXZyDX-AJREvN0,1005
3
3
  omdev/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  omdev/bracepy.py,sha256=HwBK5XmlOsF_juTel25fRLJK9vHSJCWXuCc-OZlevRQ,2619
@@ -61,8 +61,9 @@ omdev/cli/__init__.py,sha256=V_l6VP1SZMlJbO-8CJwSuO9TThOy2S_oaPepNYgIrbE,37
61
61
  omdev/cli/__main__.py,sha256=mOJpgc07o0r5luQ1DlX4tk2PqZkgmbwPbdzJ3KmtjgQ,138
62
62
  omdev/cli/clicli.py,sha256=rQ9-F9XI3BevnfIVALHVKrrHNQPdYhkQ-IKESTNB5RA,2447
63
63
  omdev/cli/install.py,sha256=C-W171YlIHt4Cfok-nWSMbHwWhqF_PFqq2HixFttYx8,4460
64
- omdev/cli/main.py,sha256=oCwKlTiEWIvFT5O1_1R3XxldjFabWI_kEyeRUWJJNiI,3856
65
- omdev/cli/managers.py,sha256=zqhMgNnv2VbXoTP6SgZeSuWfAVo1Ge-HJnQ1ftL-Mq8,2590
64
+ omdev/cli/main.py,sha256=fQL-KdKZDmw00d8vtgxGmUc9Pp3dnhW1BW-Pzu6JPX0,4172
65
+ omdev/cli/managers.py,sha256=tC4saQQhawMwmRzXs4ErKuO3P10rm7GhY2PUUsTK2Ss,1159
66
+ omdev/cli/pathhack.py,sha256=_446loyBbCI3LaP2OhYAkKjWEgf_7eJ6UZyt_hlrClA,1479
66
67
  omdev/cli/types.py,sha256=bqKw9SbtBtAip2vF9v4khh0CqKG6LBr6n9VzWBz7AJE,474
67
68
  omdev/interp/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
68
69
  omdev/interp/__main__.py,sha256=GMCqeGYltgt5dlJzHxY9gqisa8cRkrPfmZYuZnjg4WI,162
@@ -92,6 +93,8 @@ omdev/precheck/git.py,sha256=APC5Ln7x0zDrQiGPRWPsBcVJK3vWhbU-brqR5M63JQA,849
92
93
  omdev/precheck/lite.py,sha256=MLeDZP2UexNZzYTcSx4-LrhA97kCKn8tXrGkhsJb6I0,3649
93
94
  omdev/precheck/precheck.py,sha256=Boe3zbK0RXCGzw9H_OsyqJ4yMETuyrwy8P4UFAZQcTY,2477
94
95
  omdev/precheck/scripts.py,sha256=qq6MXkxgrYngPg5pWnXH4uRSuRkP3mFqbeml1UmvGBc,1265
96
+ omdev/pycharm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
97
+ omdev/pycharm/runhack.py,sha256=LfqxlRS3L8vObsmo_C4sG0ONMEqr1RgAojP2OMQFzlA,31777
95
98
  omdev/pyproject/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
96
99
  omdev/pyproject/__main__.py,sha256=gn3Rl1aYPYdiTtEqa9ifi0t-e4ZwPY0vhJ4UXvYdJDY,165
97
100
  omdev/pyproject/cexts.py,sha256=x13piOOnNrYbA17qZLDVuR0p1sqhgEwpk4FtImX-klM,4281
@@ -105,12 +108,12 @@ omdev/scripts/execrss.py,sha256=d6purJqU99OkMcNxCS1kG2CMfSsw7wjnvBQW7SjyJ70,448
105
108
  omdev/scripts/exectime.py,sha256=LRVIJsnvGYUqH-zfCdFnrQCZv1KLXJPtWBWplXMDwhI,407
106
109
  omdev/scripts/importtrace.py,sha256=4ozdphT4VuP8L0kE0HmGMyWaWHnXg1KEukbET4pFgJU,14064
107
110
  omdev/scripts/interp.py,sha256=7xeihsrt3DI_s1fZqNweivBUUwuGkS5C5cWw4QY6q30,70999
108
- omdev/scripts/pyproject.py,sha256=fuCXOk44Ui5cangCFGi44ckPezawW2N9aJ8bdOAxL50,157493
111
+ omdev/scripts/pyproject.py,sha256=_B5LB4YcF1SKiZ7J0udpoaL1dI0IGFdS_1ZLIyNT2ac,157556
109
112
  omdev/toml/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
110
113
  omdev/toml/parser.py,sha256=84bn09uhYHwQGyfww6Rw6y1RxPAE_HDltODOSakcqDM,29186
111
114
  omdev/toml/writer.py,sha256=lk3on3YXVbWuLJa-xsOzOhs1bBAT1vXqw4mBbluZl_w,3040
112
115
  omdev/tools/__init__.py,sha256=iVJAOQ0viGTQOm0DLX4uZLro-9jOioYJGLg9s0kDx1A,78
113
- omdev/tools/dockertools.py,sha256=x00GV8j1KReMXwxJ641GlcsVwHoWeuzdIKVBp36BqwU,5298
116
+ omdev/tools/dockertools.py,sha256=fkiIAzV-67b4knoF68P19shk94Vec_7xX8MwFGzvPlc,6907
114
117
  omdev/tools/gittools.py,sha256=SMuKeonZP16lYBecmKB7sn_VZ-ljQnJJF6TGX0isVwA,2031
115
118
  omdev/tools/importscan.py,sha256=vxOMdAABShqt5-G3n6DGHopCZ5uGgciThY0MCa5W0mA,4066
116
119
  omdev/tools/mkrelimp.py,sha256=fwt4GWzenuLNVtzdK2uaJJTSuJbUVJZquF5adwAwlPg,4051
@@ -119,9 +122,9 @@ omdev/tools/piptools.py,sha256=-jR5q3w4sHqntxCLExFCBNIARB788FUsAbJ62PK2sBU,2774
119
122
  omdev/tools/proftools.py,sha256=xKSm_yPoCnfsvS3iT9MblDqFMuZmGfI3_koGj8amMyU,145
120
123
  omdev/tools/rst.py,sha256=6dWk8QZHoGiLSuBw3TKsXZjjFK6wWBEtPi9krdCLKKg,977
121
124
  omdev/tools/sqlrepl.py,sha256=tmFZh80-xsGM62dyQ7_UGLebChrj7IHbIPYBWDJMgVk,5741
122
- omdev-0.0.0.dev62.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
123
- omdev-0.0.0.dev62.dist-info/METADATA,sha256=-I4CBhtt0073eN_yb7XEor8jEN1JeDBTzxMHe4lCdMU,1252
124
- omdev-0.0.0.dev62.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
125
- omdev-0.0.0.dev62.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
126
- omdev-0.0.0.dev62.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
127
- omdev-0.0.0.dev62.dist-info/RECORD,,
125
+ omdev-0.0.0.dev64.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
126
+ omdev-0.0.0.dev64.dist-info/METADATA,sha256=4QNyEbgJ8PEIAKERK8Si6wUJ8ak1ICF4bXAYks2COJo,1252
127
+ omdev-0.0.0.dev64.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
128
+ omdev-0.0.0.dev64.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
129
+ omdev-0.0.0.dev64.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
130
+ omdev-0.0.0.dev64.dist-info/RECORD,,