omdev 0.0.0.dev363__py3-none-any.whl → 0.0.0.dev364__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.
omdev/__about__.py CHANGED
@@ -31,7 +31,7 @@ class Project(ProjectBase):
31
31
  ],
32
32
 
33
33
  'mypy': [
34
- 'mypy ~= 1.16',
34
+ 'mypy ~= 1.17',
35
35
  ],
36
36
 
37
37
  'prof': [
omdev/scripts/ci.py CHANGED
@@ -962,7 +962,7 @@ class Checks:
962
962
  render_fmt='%s',
963
963
  )
964
964
 
965
- return v # type: ignore
965
+ return v
966
966
 
967
967
  def non_empty_str(self, v: ta.Optional[str], msg: CheckMessage = None) -> str:
968
968
  if not isinstance(v, str) or not v:
@@ -2858,7 +2858,7 @@ class ArgparseCli:
2858
2858
 
2859
2859
  if self._unknown_args and not (cmd is not None and cmd.accepts_unknown):
2860
2860
  msg = f'unrecognized arguments: {" ".join(self._unknown_args)}'
2861
- if (parser := self.get_parser()).exit_on_error: # type: ignore
2861
+ if (parser := self.get_parser()).exit_on_error:
2862
2862
  parser.error(msg)
2863
2863
  else:
2864
2864
  raise argparse.ArgumentError(None, msg)
@@ -5812,7 +5812,7 @@ class SubprocessRun:
5812
5812
  ) -> SubprocessRunOutput:
5813
5813
  if subprocesses is None:
5814
5814
  subprocesses = self._DEFAULT_SUBPROCESSES
5815
- return check.not_none(subprocesses).run_(self.replace(**kwargs)) # type: ignore[attr-defined]
5815
+ return check.not_none(subprocesses).run_(self.replace(**kwargs))
5816
5816
 
5817
5817
  _DEFAULT_ASYNC_SUBPROCESSES: ta.ClassVar[ta.Optional[ta.Any]] = None # AbstractAsyncSubprocesses
5818
5818
 
@@ -5823,7 +5823,7 @@ class SubprocessRun:
5823
5823
  ) -> SubprocessRunOutput:
5824
5824
  if async_subprocesses is None:
5825
5825
  async_subprocesses = self._DEFAULT_ASYNC_SUBPROCESSES
5826
- return await check.not_none(async_subprocesses).run_(self.replace(**kwargs)) # type: ignore[attr-defined]
5826
+ return await check.not_none(async_subprocesses).run_(self.replace(**kwargs))
5827
5827
 
5828
5828
 
5829
5829
  SubprocessRun._FIELD_NAMES = frozenset(fld.name for fld in dc.fields(SubprocessRun)) # noqa
omdev/scripts/interp.py CHANGED
@@ -989,7 +989,7 @@ class Checks:
989
989
  render_fmt='%s',
990
990
  )
991
991
 
992
- return v # type: ignore
992
+ return v
993
993
 
994
994
  def non_empty_str(self, v: ta.Optional[str], msg: CheckMessage = None) -> str:
995
995
  if not isinstance(v, str) or not v:
@@ -2560,7 +2560,7 @@ class ArgparseCli:
2560
2560
 
2561
2561
  if self._unknown_args and not (cmd is not None and cmd.accepts_unknown):
2562
2562
  msg = f'unrecognized arguments: {" ".join(self._unknown_args)}'
2563
- if (parser := self.get_parser()).exit_on_error: # type: ignore
2563
+ if (parser := self.get_parser()).exit_on_error:
2564
2564
  parser.error(msg)
2565
2565
  else:
2566
2566
  raise argparse.ArgumentError(None, msg)
@@ -3873,7 +3873,7 @@ class SubprocessRun:
3873
3873
  ) -> SubprocessRunOutput:
3874
3874
  if subprocesses is None:
3875
3875
  subprocesses = self._DEFAULT_SUBPROCESSES
3876
- return check.not_none(subprocesses).run_(self.replace(**kwargs)) # type: ignore[attr-defined]
3876
+ return check.not_none(subprocesses).run_(self.replace(**kwargs))
3877
3877
 
3878
3878
  _DEFAULT_ASYNC_SUBPROCESSES: ta.ClassVar[ta.Optional[ta.Any]] = None # AbstractAsyncSubprocesses
3879
3879
 
@@ -3884,7 +3884,7 @@ class SubprocessRun:
3884
3884
  ) -> SubprocessRunOutput:
3885
3885
  if async_subprocesses is None:
3886
3886
  async_subprocesses = self._DEFAULT_ASYNC_SUBPROCESSES
3887
- return await check.not_none(async_subprocesses).run_(self.replace(**kwargs)) # type: ignore[attr-defined]
3887
+ return await check.not_none(async_subprocesses).run_(self.replace(**kwargs))
3888
3888
 
3889
3889
 
3890
3890
  SubprocessRun._FIELD_NAMES = frozenset(fld.name for fld in dc.fields(SubprocessRun)) # noqa
@@ -2412,7 +2412,7 @@ class Checks:
2412
2412
  render_fmt='%s',
2413
2413
  )
2414
2414
 
2415
- return v # type: ignore
2415
+ return v
2416
2416
 
2417
2417
  def non_empty_str(self, v: ta.Optional[str], msg: CheckMessage = None) -> str:
2418
2418
  if not isinstance(v, str) or not v:
@@ -4352,7 +4352,7 @@ class ArgparseCli:
4352
4352
 
4353
4353
  if self._unknown_args and not (cmd is not None and cmd.accepts_unknown):
4354
4354
  msg = f'unrecognized arguments: {" ".join(self._unknown_args)}'
4355
- if (parser := self.get_parser()).exit_on_error: # type: ignore
4355
+ if (parser := self.get_parser()).exit_on_error:
4356
4356
  parser.error(msg)
4357
4357
  else:
4358
4358
  raise argparse.ArgumentError(None, msg)
@@ -6263,7 +6263,7 @@ class SubprocessRun:
6263
6263
  ) -> SubprocessRunOutput:
6264
6264
  if subprocesses is None:
6265
6265
  subprocesses = self._DEFAULT_SUBPROCESSES
6266
- return check.not_none(subprocesses).run_(self.replace(**kwargs)) # type: ignore[attr-defined]
6266
+ return check.not_none(subprocesses).run_(self.replace(**kwargs))
6267
6267
 
6268
6268
  _DEFAULT_ASYNC_SUBPROCESSES: ta.ClassVar[ta.Optional[ta.Any]] = None # AbstractAsyncSubprocesses
6269
6269
 
@@ -6274,7 +6274,7 @@ class SubprocessRun:
6274
6274
  ) -> SubprocessRunOutput:
6275
6275
  if async_subprocesses is None:
6276
6276
  async_subprocesses = self._DEFAULT_ASYNC_SUBPROCESSES
6277
- return await check.not_none(async_subprocesses).run_(self.replace(**kwargs)) # type: ignore[attr-defined]
6277
+ return await check.not_none(async_subprocesses).run_(self.replace(**kwargs))
6278
6278
 
6279
6279
 
6280
6280
  SubprocessRun._FIELD_NAMES = frozenset(fld.name for fld in dc.fields(SubprocessRun)) # noqa
omdev/tools/docker.py CHANGED
@@ -115,7 +115,7 @@ class Cli(ap.Cli):
115
115
  dct: dict[str, list[PortEntry]] = {}
116
116
 
117
117
  with lang.disposing(yaml.WrappedLoaders.base(yml_src)) as loader:
118
- val = check.not_none(loader.get_single_data()) # type: ignore
118
+ val = check.not_none(loader.get_single_data())
119
119
  root = check.isinstance(val.value, ta.Mapping)
120
120
 
121
121
  services = check.isinstance(
omdev/tools/json/cli.py CHANGED
@@ -88,6 +88,7 @@ def _build_args_parser() -> argparse.ArgumentParser:
88
88
  parser.add_argument('-x', '--jmespath-expr')
89
89
  parser.add_argument('-M', '--marshal', action='store_true')
90
90
  parser.add_argument('-F', '--flat', action='store_true')
91
+ parser.add_argument('-e', '--prune-empty', action='store_true')
91
92
  parser.add_argument('-E', '--omit-empty', action='store_true')
92
93
 
93
94
  parser.add_argument('-z', '--compact', action='store_true')
@@ -136,6 +137,7 @@ def _process_args(args: ta.Any) -> RunConfiguration:
136
137
  jmespath_expr=args.jmespath_expr,
137
138
  marshal=args.marshal,
138
139
  flat=args.flat,
140
+ prune_empty=args.prune_empty,
139
141
  omit_empty=args.omit_empty,
140
142
  )
141
143
 
@@ -20,9 +20,20 @@ class ProcessingOptions:
20
20
  jmespath_expr: ta.Any | None = None
21
21
  marshal: bool = False
22
22
  flat: bool = False
23
+ prune_empty: bool = False
23
24
  omit_empty: bool = False
24
25
 
25
26
 
27
+ def _prune_empty(v: ta.Any) -> ta.Any:
28
+ # if isinstance(v, ta.Mapping):
29
+ # v = type(v)([
30
+ # (_prune_empty(k), _prune_empty(v))
31
+ # for k, v in v.items()
32
+ # ])
33
+ # elif
34
+ raise NotImplementedError
35
+
36
+
26
37
  class Processor:
27
38
  def __init__(self, opts: ProcessingOptions) -> None:
28
39
  super().__init__()
@@ -68,6 +79,9 @@ class Processor:
68
79
  vs = [v]
69
80
 
70
81
  for v in vs:
82
+ if self._opts.prune_empty:
83
+ v = _prune_empty(v)
84
+
71
85
  if self._opts.omit_empty:
72
86
  if v is None or (isinstance(v, (ta.Sequence, ta.Mapping)) and not v):
73
87
  continue
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.0.dev363
3
+ Version: 0.0.0.dev364
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.13
14
14
  License-File: LICENSE
15
- Requires-Dist: omlish==0.0.0.dev363
15
+ Requires-Dist: omlish==0.0.0.dev364
16
16
  Provides-Extra: all
17
17
  Requires-Dist: black~=25.1; extra == "all"
18
18
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -21,7 +21,7 @@ Requires-Dist: docutils~=0.21; extra == "all"
21
21
  Requires-Dist: markdown-it-py~=3.0; extra == "all"
22
22
  Requires-Dist: mdit-py-plugins~=0.4; extra == "all"
23
23
  Requires-Dist: pygments~=2.19; extra == "all"
24
- Requires-Dist: mypy~=1.16; extra == "all"
24
+ Requires-Dist: mypy~=1.17; extra == "all"
25
25
  Requires-Dist: gprof2dot~=2025.4; extra == "all"
26
26
  Requires-Dist: prompt-toolkit~=3.0; extra == "all"
27
27
  Requires-Dist: segno~=1.6; extra == "all"
@@ -36,7 +36,7 @@ Requires-Dist: markdown-it-py~=3.0; extra == "doc"
36
36
  Requires-Dist: mdit-py-plugins~=0.4; extra == "doc"
37
37
  Requires-Dist: pygments~=2.19; extra == "doc"
38
38
  Provides-Extra: mypy
39
- Requires-Dist: mypy~=1.16; extra == "mypy"
39
+ Requires-Dist: mypy~=1.17; extra == "mypy"
40
40
  Provides-Extra: prof
41
41
  Requires-Dist: gprof2dot~=2025.4; extra == "prof"
42
42
  Provides-Extra: ptk
@@ -1,5 +1,5 @@
1
1
  omdev/.manifests.json,sha256=ZGEqfCA_ll4cndDBBnMhEe6QPGVJwxawDBKEI0MPVIQ,11870
2
- omdev/__about__.py,sha256=2_6pQyjxqAspvwBSJUWQgdBBcGaDO3zX8yETLaspUQE,1202
2
+ omdev/__about__.py,sha256=_c693iMsl07FKXJ_2zrWiE8t84SSbDxlCrash1rJR7M,1202
3
3
  omdev/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  omdev/cmake.py,sha256=9rfSvFHPmKDj9ngvfDB2vK8O-xO_ZwUm7hMKLWA-yOw,4578
5
5
  omdev/imgur.py,sha256=4XolajBnAJ1U2zvT6Y0fiUyBi_a8G9arXffvPxf3w-M,3103
@@ -252,9 +252,9 @@ omdev/pyproject/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
252
252
  omdev/pyproject/resources/docker-dev.sh,sha256=DHkz5D18jok_oDolfg2mqrvGRWFoCe9GQo04dR1czcc,838
253
253
  omdev/pyproject/resources/python.sh,sha256=rFaN4SiJ9hdLDXXsDTwugI6zsw6EPkgYMmtacZeTbvw,749
254
254
  omdev/scripts/__init__.py,sha256=MKCvUAEQwsIvwLixwtPlpBqmkMXLCnjjXyAXvVpDwVk,91
255
- omdev/scripts/ci.py,sha256=eeRwS9-p2_8-D2CIVQMAqPYNR9bpqph0tn-kH5YX2rA,358076
256
- omdev/scripts/interp.py,sha256=n-J816SHnaV52o6ROWV-GtopIjyaA3uTrnJoNYcYbdY,158187
257
- omdev/scripts/pyproject.py,sha256=m1mziw1OOCJqhwmIXSvXDFFUMa2VGIpKYv_d1k6YgIU,267718
255
+ omdev/scripts/ci.py,sha256=9yDySeJ4tU63Zf8jSL2QdM1jkCEQ3T8VCTc3pHOTUFo,357984
256
+ omdev/scripts/interp.py,sha256=T8EdNxuncwqCXfIBfCLoUcsYNqEhOrOE8V1hC9vTzqI,158095
257
+ omdev/scripts/pyproject.py,sha256=qBBXmbdKMYzqxnb0zEWYhCOg9Cy0pWno3wjulICFj_o,267626
258
258
  omdev/scripts/slowcat.py,sha256=lssv4yrgJHiWfOiHkUut2p8E8Tq32zB-ujXESQxFFHY,2728
259
259
  omdev/scripts/tmpexec.py,sha256=WTYcf56Tj2qjYV14AWmV8SfT0u6Y8eIU6cKgQRvEK3c,1442
260
260
  omdev/tokens/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -265,7 +265,7 @@ omdev/tools/__init__.py,sha256=iVJAOQ0viGTQOm0DLX4uZLro-9jOioYJGLg9s0kDx1A,78
265
265
  omdev/tools/cloc.py,sha256=BiIf2PnnoRH6ByH4mnua69Vv-ZDPHsSAPUds7giRolI,6013
266
266
  omdev/tools/diff.py,sha256=S6ddB7pBeMtzKh2hiHfzQ93pj6mclKt1UZQMKy4Bt5M,520
267
267
  omdev/tools/doc.py,sha256=PCtqDjFA55Ed4QVUpMiw05NwyXivCeox-ZE_JDN0BD0,2575
268
- omdev/tools/docker.py,sha256=bSbCtA4FBi66IgIMxKcJwJ_JM6y4GdLnLtHjhEO71Eg,7379
268
+ omdev/tools/docker.py,sha256=4TdpKiWMr9eCffAPHo6sAWGURGTYMY5AK_F5lmnwlJA,7363
269
269
  omdev/tools/intellij.py,sha256=yy6Uw2hcYyEWLZESAupKvd3U6omirYMbjnbw7UllhV4,5834
270
270
  omdev/tools/linehisto.py,sha256=0ZNm34EuiZBE9Q2YC6KNLNNydNT8QPSOwvYzXiU9S2Q,8881
271
271
  omdev/tools/mkenv.py,sha256=G2tu5bmiyKFyZuqtUoM7Z-6AI6CI86F2LwoIozoWOvo,2300
@@ -288,11 +288,11 @@ omdev/tools/git/consts.py,sha256=JuXivUNDkNhM4pe97icjRVAKM8cNRbrODquHINNKqOE,40
288
288
  omdev/tools/git/messages.py,sha256=NWztIK0nAKJIOVzuVQcR_5LHZUgqyVkrOlpl7dFLMdU,2424
289
289
  omdev/tools/json/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
290
290
  omdev/tools/json/__main__.py,sha256=wqpkN_NsQyNwKW4qjVj8ADJ4_C98KhrFBtE-Z1UamfU,168
291
- omdev/tools/json/cli.py,sha256=v8YsChDN97y7XDsNRs3zimCAwCkJQkMDcd8CXhfUVGY,10087
291
+ omdev/tools/json/cli.py,sha256=8aXX3ijU3lvPZamkIyUOz-vlBmyIdaX7dCQq5rN7adE,10193
292
292
  omdev/tools/json/formats.py,sha256=1qGYb8Kq_yFpLMaecBg-XE3yWSvqRiRbBX8SAElpS9s,2643
293
293
  omdev/tools/json/io.py,sha256=sfj2hJS9Hy3aUR8a_lLzOrYcmL9fSKyvOHiofdUASsI,1427
294
294
  omdev/tools/json/parsing.py,sha256=xZiOH3jSVErNGKI8AysFf0zzyhivXvRakTQe7rWxhKQ,2052
295
- omdev/tools/json/processing.py,sha256=KVMVyW5dTaoPyjn2Aabkay4tBn5cwJJXtLQaJgZI7ZY,2016
295
+ omdev/tools/json/processing.py,sha256=a999e1VKeFR38eS7Pmcr8YCnzAk22Url7NuZ1fBCmts,2362
296
296
  omdev/tools/json/rendering.py,sha256=KilwK8ziHGy3Z76H9CC04x2ro5Rkws1d06D0j6TnHA4,2660
297
297
  omdev/tools/jsonview/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
298
298
  omdev/tools/jsonview/__main__.py,sha256=BF-MVWpPJJeQYUqJA48G395kxw0lEJnV-hRLV_F9G2A,173
@@ -303,9 +303,9 @@ omdev/tools/jsonview/resources/jsonview.js,sha256=faDvXDOXKvEvjOuIlz4D3F2ReQXb_b
303
303
  omdev/tools/pawk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
304
304
  omdev/tools/pawk/__main__.py,sha256=VCqeRVnqT1RPEoIrqHFSu4PXVMg4YEgF4qCQm90-eRI,66
305
305
  omdev/tools/pawk/pawk.py,sha256=ao5mdrpiSU4AZ8mBozoEaV3UVlmVTnRG9wD9XP70MZE,11429
306
- omdev-0.0.0.dev363.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
307
- omdev-0.0.0.dev363.dist-info/METADATA,sha256=A-RDWrNpLrZazbMOZmccoU5eZPLQdZHjX9SnpKkq4Pc,1674
308
- omdev-0.0.0.dev363.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
309
- omdev-0.0.0.dev363.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
310
- omdev-0.0.0.dev363.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
311
- omdev-0.0.0.dev363.dist-info/RECORD,,
306
+ omdev-0.0.0.dev364.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
307
+ omdev-0.0.0.dev364.dist-info/METADATA,sha256=3g4HotiW-zDtGxF8cJ5YxL_6gfz2hZHGmsZEh5mSppk,1674
308
+ omdev-0.0.0.dev364.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
309
+ omdev-0.0.0.dev364.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
310
+ omdev-0.0.0.dev364.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
311
+ omdev-0.0.0.dev364.dist-info/RECORD,,