omdev 0.0.0.dev61__py3-none-any.whl → 0.0.0.dev63__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.

omdev/.manifests.json CHANGED
@@ -123,7 +123,7 @@
123
123
  "module": ".tools.dockertools",
124
124
  "attr": "_CLI_MODULE",
125
125
  "file": "omdev/tools/dockertools.py",
126
- "line": 183,
126
+ "line": 236,
127
127
  "value": {
128
128
  "$.cli.types.CliModule": {
129
129
  "cmd_name": "docker",
omdev/cli/main.py CHANGED
@@ -41,6 +41,7 @@ _CLI_FUNCS: ta.Sequence[CliFunc] = [
41
41
  def _build_arg_parser() -> argparse.ArgumentParser:
42
42
  parser = argparse.ArgumentParser()
43
43
  parser.add_argument('--cli-pkg-root', action='append')
44
+ parser.add_argument('--cli-debug', action='store_true')
44
45
  parser.add_argument('cmd', nargs='?')
45
46
  parser.add_argument('args', nargs=argparse.REMAINDER)
46
47
  return parser
@@ -132,23 +133,34 @@ def _select_cmd(args: ta.Any, cmds: ta.Mapping[str, CliCmd]) -> CliCmd | int:
132
133
  def _main() -> ta.Any:
133
134
  parser = _build_arg_parser()
134
135
  args = parser.parse_args()
135
- cmds = _build_cmd_dct(args)
136
- sel = _select_cmd(args, cmds)
137
136
 
138
- match sel:
139
- case int():
140
- return sel
137
+ def inner():
138
+ cmds = _build_cmd_dct(args)
139
+ sel = _select_cmd(args, cmds)
141
140
 
142
- case CliModule() as cm:
143
- sys.argv = [args.cmd, *(args.args or ())]
144
- runpy._run_module_as_main(cm.mod_name) # type: ignore # noqa
145
- return 0
141
+ match sel:
142
+ case int():
143
+ return sel
146
144
 
147
- case CliFunc() as cf:
148
- return cf.fn(*(args.args or ()))
145
+ case CliModule() as cm:
146
+ sys.argv = [args.cmd, *(args.args or ())]
147
+ runpy._run_module_as_main(cm.mod_name) # type: ignore # noqa
148
+ return 0
149
149
 
150
- case _:
151
- raise TypeError(sel)
150
+ case CliFunc() as cf:
151
+ return cf.fn(*(args.args or ()))
152
+
153
+ case _:
154
+ raise TypeError(sel)
155
+
156
+ if args.cli_debug:
157
+ from omlish.diag.debug import debugging_on_exception
158
+
159
+ with debugging_on_exception():
160
+ return inner()
161
+
162
+ else:
163
+ return inner()
152
164
 
153
165
 
154
166
  if __name__ == '__main__':
@@ -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.dev61
3
+ Version: 0.0.0.dev63
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.dev61
15
+ Requires-Dist: omlish ==0.0.0.dev63
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,7 +61,7 @@ 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
64
+ omdev/cli/main.py,sha256=fQL-KdKZDmw00d8vtgxGmUc9Pp3dnhW1BW-Pzu6JPX0,4172
65
65
  omdev/cli/managers.py,sha256=zqhMgNnv2VbXoTP6SgZeSuWfAVo1Ge-HJnQ1ftL-Mq8,2590
66
66
  omdev/cli/types.py,sha256=bqKw9SbtBtAip2vF9v4khh0CqKG6LBr6n9VzWBz7AJE,474
67
67
  omdev/interp/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
@@ -105,12 +105,12 @@ omdev/scripts/execrss.py,sha256=d6purJqU99OkMcNxCS1kG2CMfSsw7wjnvBQW7SjyJ70,448
105
105
  omdev/scripts/exectime.py,sha256=LRVIJsnvGYUqH-zfCdFnrQCZv1KLXJPtWBWplXMDwhI,407
106
106
  omdev/scripts/importtrace.py,sha256=4ozdphT4VuP8L0kE0HmGMyWaWHnXg1KEukbET4pFgJU,14064
107
107
  omdev/scripts/interp.py,sha256=7xeihsrt3DI_s1fZqNweivBUUwuGkS5C5cWw4QY6q30,70999
108
- omdev/scripts/pyproject.py,sha256=fuCXOk44Ui5cangCFGi44ckPezawW2N9aJ8bdOAxL50,157493
108
+ omdev/scripts/pyproject.py,sha256=_B5LB4YcF1SKiZ7J0udpoaL1dI0IGFdS_1ZLIyNT2ac,157556
109
109
  omdev/toml/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
110
110
  omdev/toml/parser.py,sha256=84bn09uhYHwQGyfww6Rw6y1RxPAE_HDltODOSakcqDM,29186
111
111
  omdev/toml/writer.py,sha256=lk3on3YXVbWuLJa-xsOzOhs1bBAT1vXqw4mBbluZl_w,3040
112
112
  omdev/tools/__init__.py,sha256=iVJAOQ0viGTQOm0DLX4uZLro-9jOioYJGLg9s0kDx1A,78
113
- omdev/tools/dockertools.py,sha256=x00GV8j1KReMXwxJ641GlcsVwHoWeuzdIKVBp36BqwU,5298
113
+ omdev/tools/dockertools.py,sha256=fkiIAzV-67b4knoF68P19shk94Vec_7xX8MwFGzvPlc,6907
114
114
  omdev/tools/gittools.py,sha256=SMuKeonZP16lYBecmKB7sn_VZ-ljQnJJF6TGX0isVwA,2031
115
115
  omdev/tools/importscan.py,sha256=vxOMdAABShqt5-G3n6DGHopCZ5uGgciThY0MCa5W0mA,4066
116
116
  omdev/tools/mkrelimp.py,sha256=fwt4GWzenuLNVtzdK2uaJJTSuJbUVJZquF5adwAwlPg,4051
@@ -119,9 +119,9 @@ omdev/tools/piptools.py,sha256=-jR5q3w4sHqntxCLExFCBNIARB788FUsAbJ62PK2sBU,2774
119
119
  omdev/tools/proftools.py,sha256=xKSm_yPoCnfsvS3iT9MblDqFMuZmGfI3_koGj8amMyU,145
120
120
  omdev/tools/rst.py,sha256=6dWk8QZHoGiLSuBw3TKsXZjjFK6wWBEtPi9krdCLKKg,977
121
121
  omdev/tools/sqlrepl.py,sha256=tmFZh80-xsGM62dyQ7_UGLebChrj7IHbIPYBWDJMgVk,5741
122
- omdev-0.0.0.dev61.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
123
- omdev-0.0.0.dev61.dist-info/METADATA,sha256=M-ND1diCFqD5wMkvo8x_etYENZI5gtH2UJC2RF8C7iY,1252
124
- omdev-0.0.0.dev61.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
125
- omdev-0.0.0.dev61.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
126
- omdev-0.0.0.dev61.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
127
- omdev-0.0.0.dev61.dist-info/RECORD,,
122
+ omdev-0.0.0.dev63.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
123
+ omdev-0.0.0.dev63.dist-info/METADATA,sha256=pvbtnU8Sk3rSwiqGcYUEZqv9kPsNqo0ep9EEG5YahWs,1252
124
+ omdev-0.0.0.dev63.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
125
+ omdev-0.0.0.dev63.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
126
+ omdev-0.0.0.dev63.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
127
+ omdev-0.0.0.dev63.dist-info/RECORD,,