omdev 0.0.0.dev363__py3-none-any.whl → 0.0.0.dev365__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/cc/cli.py CHANGED
@@ -17,8 +17,11 @@ Freestanding options:
17
17
 
18
18
  TODO:
19
19
  - cext interop
20
- - gen cmake
20
+ - cc cmake
21
+ - shlex shebang to extract opts
21
22
  - nanobind
23
+ - 2 dep mechanisms? not necessarily bad
24
+ - cc ij, based off of cmake
22
25
  - fix CFLAGS/CCFLAGS/CPPFLAGS/CXXFLAGS
23
26
  - jit-gen cmake mode? multi-src builds
24
27
  """
@@ -44,7 +44,7 @@ class Section(ta.NamedTuple):
44
44
  type: SectionType
45
45
 
46
46
 
47
- _GOOGLE_TYPED_ARG_PAT = re.compile(r'\s*(.+?)\s*\(\s*(.*[^\s]+)\s*\)')
47
+ _GOOGLE_TYPED_ARG_PAT = re.compile(r'\s*(.+?)\s*\(\s*(.*\S+)\s*\)')
48
48
  _GOOGLE_ARG_DESC_PAT = re.compile(r'.*\. Defaults to (.+)\.')
49
49
  _MULTIPLE_PATTERN = re.compile(r'(\s*[^:\s]+:)|([^:]*\]:.*)')
50
50
 
@@ -70,7 +70,9 @@ class GoogleParser:
70
70
  def __init__(
71
71
  self,
72
72
  sections: list[Section] | None = None,
73
+ *,
73
74
  title_colon: bool = True,
75
+ meta_separators: ta.Sequence[str] = ':-',
74
76
  ) -> None:
75
77
  """
76
78
  Setup sections.
@@ -85,6 +87,7 @@ class GoogleParser:
85
87
  sections = DEFAULT_SECTIONS
86
88
  self.sections = {s.title: s for s in sections}
87
89
  self.title_colon = title_colon
90
+ self.meta_separators = meta_separators
88
91
  self._setup()
89
92
 
90
93
  def _setup(self) -> None:
@@ -94,11 +97,11 @@ class GoogleParser:
94
97
  colon = ''
95
98
 
96
99
  self.titles_re = re.compile(
97
- '^('
98
- + '|'.join(f'({t})' for t in self.sections)
99
- + ')'
100
- + colon
101
- + '[ \t\r\f\v]*$',
100
+ '^(' +
101
+ '|'.join(f'({t})' for t in self.sections) +
102
+ ')' +
103
+ colon +
104
+ '[ \t\r\f\v]*$',
102
105
  flags=re.MULTILINE,
103
106
  )
104
107
 
@@ -122,19 +125,23 @@ class GoogleParser:
122
125
  ):
123
126
  return self._build_single_meta(section, text)
124
127
 
125
- if ':' not in text:
126
- raise ParseError(f'Expected a colon in {text!r}.')
128
+ seps = self.meta_separators
129
+ for sep in seps:
130
+ if sep not in text:
131
+ continue
132
+
133
+ # Split spec and description
134
+ before, desc = text.split(sep, 1)
135
+ if desc:
136
+ desc = desc[1:] if desc[0] == ' ' else desc
137
+ if '\n' in desc:
138
+ first_line, rest = desc.split('\n', 1)
139
+ desc = first_line + '\n' + inspect.cleandoc(rest)
140
+ desc = desc.strip('\n')
127
141
 
128
- # Split spec and description
129
- before, desc = text.split(':', 1)
130
- if desc:
131
- desc = desc[1:] if desc[0] == ' ' else desc
132
- if '\n' in desc:
133
- first_line, rest = desc.split('\n', 1)
134
- desc = first_line + '\n' + inspect.cleandoc(rest)
135
- desc = desc.strip('\n')
142
+ return self._build_multi_meta(section, before, desc)
136
143
 
137
- return self._build_multi_meta(section, before, desc)
144
+ raise ParseError(f'Expected some separator {seps!r} in {text!r}.')
138
145
 
139
146
  @staticmethod
140
147
  def _build_single_meta(section: Section, desc: str) -> DocstringMeta:
@@ -161,7 +168,7 @@ class GoogleParser:
161
168
  )
162
169
 
163
170
  if section.key in PARAM_KEYWORDS:
164
- raise ParseError('Expected paramenter name.')
171
+ raise ParseError('Expected parameter name.')
165
172
 
166
173
  return DocstringMeta(args=[section.key], description=desc)
167
174
 
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:
@@ -1975,6 +1975,31 @@ def unlinking_if_exists(path: str) -> ta.Iterator[None]:
1975
1975
  ##
1976
1976
 
1977
1977
 
1978
+ @ta.overload
1979
+ def path_dirname(p: str, n: int = 1) -> str:
1980
+ ...
1981
+
1982
+
1983
+ @ta.overload
1984
+ def path_dirname(p: bytes, n: int = 1) -> bytes:
1985
+ ...
1986
+
1987
+
1988
+ def path_dirname(p, n=1):
1989
+ if isinstance(p, bytes):
1990
+ sep: ta.Any = b'/'
1991
+ else:
1992
+ sep = '/'
1993
+ p = os.fspath(p)
1994
+ i = -1
1995
+ for _ in range(n):
1996
+ i = p.rindex(sep, 0, i)
1997
+ head = p[:i + 1]
1998
+ if head and head != sep * len(head):
1999
+ head = head.rstrip(sep)
2000
+ return head
2001
+
2002
+
1978
2003
  def abs_real_path(p: str) -> str:
1979
2004
  return os.path.abspath(os.path.realpath(p))
1980
2005
 
@@ -2858,7 +2883,7 @@ class ArgparseCli:
2858
2883
 
2859
2884
  if self._unknown_args and not (cmd is not None and cmd.accepts_unknown):
2860
2885
  msg = f'unrecognized arguments: {" ".join(self._unknown_args)}'
2861
- if (parser := self.get_parser()).exit_on_error: # type: ignore
2886
+ if (parser := self.get_parser()).exit_on_error:
2862
2887
  parser.error(msg)
2863
2888
  else:
2864
2889
  raise argparse.ArgumentError(None, msg)
@@ -5812,7 +5837,7 @@ class SubprocessRun:
5812
5837
  ) -> SubprocessRunOutput:
5813
5838
  if subprocesses is None:
5814
5839
  subprocesses = self._DEFAULT_SUBPROCESSES
5815
- return check.not_none(subprocesses).run_(self.replace(**kwargs)) # type: ignore[attr-defined]
5840
+ return check.not_none(subprocesses).run_(self.replace(**kwargs))
5816
5841
 
5817
5842
  _DEFAULT_ASYNC_SUBPROCESSES: ta.ClassVar[ta.Optional[ta.Any]] = None # AbstractAsyncSubprocesses
5818
5843
 
@@ -5823,7 +5848,7 @@ class SubprocessRun:
5823
5848
  ) -> SubprocessRunOutput:
5824
5849
  if async_subprocesses is None:
5825
5850
  async_subprocesses = self._DEFAULT_ASYNC_SUBPROCESSES
5826
- return await check.not_none(async_subprocesses).run_(self.replace(**kwargs)) # type: ignore[attr-defined]
5851
+ return await check.not_none(async_subprocesses).run_(self.replace(**kwargs))
5827
5852
 
5828
5853
 
5829
5854
  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.dev365
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.dev365
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
@@ -36,7 +36,7 @@ omdev/cc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
36
  omdev/cc/__main__.py,sha256=n7gxSRYZ1QZOUxQPCT0_n9Xl26zi2UIvCwyGW_m67nA,166
37
37
  omdev/cc/cdeps.py,sha256=Uou-V1qcwWhe14iTu39W7yxOlDdr_P96Ai8wQjAp3zQ,1535
38
38
  omdev/cc/cdeps.toml,sha256=MqZ1OQHQ2JPvQpHRL32GpRgQWQRtzjPI2EWl4EqSm-I,1004
39
- omdev/cc/cli.py,sha256=qmBLyq7dz85Sv4xZ_YR2S4UehCGKrf7-ZIWL0RwnLIY,4918
39
+ omdev/cc/cli.py,sha256=B-_FIEjox1O9vhlvgVVO4X6Qo4acWIm-eW5kAwSwFUc,5022
40
40
  omdev/cc/srclangs.py,sha256=3u_APHgknuc-BPRQSDISwSzouluKsnLlBxodp-XCl_E,728
41
41
  omdev/cexts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
42
  omdev/cexts/_boilerplate.cc,sha256=sbpXEgdFrkdzZXgaNWFFNN27fL9TZu6VrwvMY4-nnFM,1726
@@ -228,7 +228,7 @@ omdev/py/docstrings/__init__.py,sha256=HFzqco1oj6M7KQ80i48W9gYABVJU8oM_1wpl9ndBN
228
228
  omdev/py/docstrings/attrdoc.py,sha256=xo-AFqEPfz1XppsCMJS80pG1Vdd2TiBsoxZ7YP6ZHC4,4269
229
229
  omdev/py/docstrings/common.py,sha256=7YUu5-RxhbCEKHMvfUNxXhTd9lcGTC8CGAmWeXZTta4,6378
230
230
  omdev/py/docstrings/epydoc.py,sha256=Z6Dg6ImKOY3hP-mZoiwU3nGOReap5vt_T_3LIGnpess,6177
231
- omdev/py/docstrings/google.py,sha256=D0KHXPRsf3HFKZmMXdBnfkVGclnjQX7ae9wMqsMVeqs,10301
231
+ omdev/py/docstrings/google.py,sha256=zWrhzQ_QGOtH6s9SfmZGCduKv3JJVe6rJlDe-kAdUW8,10552
232
232
  omdev/py/docstrings/numpydoc.py,sha256=SLyIoPR5U5HtXJ18yeQf4HlYHtcro3THh9CqeWDDDH4,12266
233
233
  omdev/py/docstrings/parser.py,sha256=umJEgQBkSXLwWIKZrBbFCfNrz847vpTNDqTTEwlvHpA,2324
234
234
  omdev/py/docstrings/rest.py,sha256=c2xPYg_W01W9eYY_KLKX69E4qu4jpkgUshi5K5EyVv8,5221
@@ -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=eaxyndzJcHoXh1jbsP67QbtMgVzOgr2RvN0ysAoAOyI,358433
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.dev365.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
307
+ omdev-0.0.0.dev365.dist-info/METADATA,sha256=kQICG8LA3JGKzBdHFee2vJVQP5hh1R-racMDhIO7CQU,1674
308
+ omdev-0.0.0.dev365.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
309
+ omdev-0.0.0.dev365.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
310
+ omdev-0.0.0.dev365.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
311
+ omdev-0.0.0.dev365.dist-info/RECORD,,