omdev 0.0.0.dev78__py3-none-any.whl → 0.0.0.dev80__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
@@ -11,6 +11,18 @@
11
11
  }
12
12
  }
13
13
  },
14
+ {
15
+ "module": ".bracepy",
16
+ "attr": "_CLI_MODULE",
17
+ "file": "omdev/bracepy.py",
18
+ "line": 88,
19
+ "value": {
20
+ "$.cli.types.CliModule": {
21
+ "cmd_name": "bracepy",
22
+ "mod_name": "omdev.bracepy"
23
+ }
24
+ }
25
+ },
14
26
  {
15
27
  "module": ".cexts.cmake",
16
28
  "attr": "_CLI_MODULE",
@@ -30,7 +42,7 @@
30
42
  "line": 62,
31
43
  "value": {
32
44
  "$.cli.types.CliModule": {
33
- "cmd_name": "classdot",
45
+ "cmd_name": "py/classdot",
34
46
  "mod_name": "omdev.classdot"
35
47
  }
36
48
  }
@@ -47,6 +59,30 @@
47
59
  }
48
60
  }
49
61
  },
62
+ {
63
+ "module": ".findimports",
64
+ "attr": "_CLI_MODULE",
65
+ "file": "omdev/findimports.py",
66
+ "line": 81,
67
+ "value": {
68
+ "$.cli.types.CliModule": {
69
+ "cmd_name": "py/findimports",
70
+ "mod_name": "omdev.findimports"
71
+ }
72
+ }
73
+ },
74
+ {
75
+ "module": ".findmagic",
76
+ "attr": "_CLI_MODULE",
77
+ "file": "omdev/findmagic.py",
78
+ "line": 65,
79
+ "value": {
80
+ "$.cli.types.CliModule": {
81
+ "cmd_name": "py/findmagic",
82
+ "mod_name": "omdev.findmagic"
83
+ }
84
+ }
85
+ },
50
86
  {
51
87
  "module": ".imgur",
52
88
  "attr": "_FOO_CLI_MODULE",
@@ -102,7 +138,7 @@
102
138
  "line": 11,
103
139
  "value": {
104
140
  "$.cli.types.CliModule": {
105
- "cmd_name": "execrss",
141
+ "cmd_name": "py/execrss",
106
142
  "mod_name": "omdev.scripts.execrss"
107
143
  }
108
144
  }
@@ -114,7 +150,7 @@
114
150
  "line": 7,
115
151
  "value": {
116
152
  "$.cli.types.CliModule": {
117
- "cmd_name": "exectime",
153
+ "cmd_name": "py/exectime",
118
154
  "mod_name": "omdev.scripts.exectime"
119
155
  }
120
156
  }
@@ -126,7 +162,7 @@
126
162
  "line": 481,
127
163
  "value": {
128
164
  "$.cli.types.CliModule": {
129
- "cmd_name": "importtrace",
165
+ "cmd_name": "py/importtrace",
130
166
  "mod_name": "omdev.scripts.importtrace"
131
167
  }
132
168
  }
@@ -162,7 +198,7 @@
162
198
  "line": 166,
163
199
  "value": {
164
200
  "$.cli.types.CliModule": {
165
- "cmd_name": "importscan",
201
+ "cmd_name": "py/importscan",
166
202
  "mod_name": "omdev.tools.importscan"
167
203
  }
168
204
  }
@@ -174,7 +210,7 @@
174
210
  "line": 148,
175
211
  "value": {
176
212
  "$.cli.types.CliModule": {
177
- "cmd_name": "mkrelimp",
213
+ "cmd_name": "py/mkrelimp",
178
214
  "mod_name": "omdev.tools.mkrelimp"
179
215
  }
180
216
  }
omdev/amalg/amalg.py CHANGED
@@ -24,6 +24,7 @@ Targets:
24
24
  - supervisor?
25
25
  """
26
26
  import argparse
27
+ import ast
27
28
  import dataclasses as dc
28
29
  import io
29
30
  import logging
@@ -297,7 +298,11 @@ def make_src_file(
297
298
  tys: list[Typing] = []
298
299
  ctls: list[Tokens] = []
299
300
 
300
- for line in cls:
301
+ i = 0
302
+ while i < len(cls):
303
+ line = cls[i]
304
+ i += 1
305
+
301
306
  if (imp := make_import(
302
307
  line,
303
308
  src_path=path,
@@ -311,6 +316,31 @@ def make_src_file(
311
316
  )) is not None:
312
317
  tys.append(ty)
313
318
 
319
+ elif (
320
+ line and
321
+ (ft := line[0]).name == 'COMMENT' and
322
+ ft.src.startswith('# @omlish-manifest')
323
+ ):
324
+ mls = [line]
325
+ while True:
326
+ mls.append(cls[i])
327
+ i += 1
328
+
329
+ msrc = tks.join_lines(mls).strip()
330
+ try:
331
+ node = ast.parse(msrc)
332
+ except SyntaxError:
333
+ continue
334
+
335
+ mmod = check.isinstance(node, ast.Module)
336
+ check.isinstance(check.single(mmod.body), ast.Assign)
337
+ break
338
+
339
+ ctls.extend([
340
+ [trt.Token('COMMENT', '# ' + tks.join_toks(ml))]
341
+ for ml in mls
342
+ ])
343
+
314
344
  else:
315
345
  ctls.append(line)
316
346
 
omdev/bracepy.py CHANGED
@@ -85,6 +85,13 @@ def translate_brace_python(
85
85
  return ret.getvalue()
86
86
 
87
87
 
88
+ # @omlish-manifest
89
+ _CLI_MODULE = {'$omdev.cli.types.CliModule': {
90
+ 'cmd_name': 'bracepy',
91
+ 'mod_name': __name__,
92
+ }}
93
+
94
+
88
95
  if __name__ == '__main__':
89
96
  def _main(argv=None) -> None:
90
97
  import argparse
omdev/classdot.py CHANGED
@@ -60,7 +60,7 @@ def _main() -> None:
60
60
 
61
61
 
62
62
  # @omlish-manifest
63
- _CLI_MODULE = CliModule('classdot', __name__)
63
+ _CLI_MODULE = CliModule('py/classdot', __name__)
64
64
 
65
65
 
66
66
  if __name__ == '__main__':
omdev/cli/main.py CHANGED
@@ -1,16 +1,19 @@
1
1
  """
2
2
  TODO:
3
+ - py/foo - root command 'py'
3
4
  - cache ldr.discover() somehow if in uvx/pipx - very slow
4
5
  - <venv-root>/.omdev-cli-manifest-cache.json - {pkg_name: manifests_json}
5
6
  - allow manually specifying manifest packages
6
7
  """
7
8
  import argparse
9
+ import dataclasses as dc
8
10
  import os
9
11
  import runpy
10
12
  import sys
11
13
  import typing as ta
12
14
 
13
15
  from omlish import check
16
+ from omlish.lite.cached import cached_nullary
14
17
 
15
18
  from ..manifests.load import ManifestLoader
16
19
  from .types import CliCmd
@@ -38,6 +41,139 @@ _CLI_FUNCS: ta.Sequence[CliFunc] = [
38
41
  ##
39
42
 
40
43
 
44
+ StrTuple: ta.TypeAlias = tuple[str, ...]
45
+ RecStrMap: ta.TypeAlias = ta.Mapping[str, ta.Union[str, 'RecStrMap']]
46
+ RecCmdMap: ta.TypeAlias = ta.Mapping[str, ta.Union[CliCmd, 'RecCmdMap']]
47
+
48
+
49
+ class CliCmdSet:
50
+ def __init__(self, cmds: ta.Iterable[CliCmd]) -> None:
51
+ super().__init__()
52
+
53
+ self._cmds = list(cmds)
54
+
55
+ @dc.dataclass(frozen=True)
56
+ class Entry:
57
+ cmd: CliCmd
58
+
59
+ exec_paths: ta.Sequence[StrTuple] # len > 1, len([0]) > 1
60
+ help_path: StrTuple | None
61
+
62
+ def _make_entry(self, cmd: CliCmd) -> Entry:
63
+ help_path: StrTuple | None
64
+
65
+ if isinstance(cmd.cmd_name, str):
66
+ ns = [cmd.cmd_name]
67
+ else:
68
+ ns = list(cmd.cmd_name)
69
+ exec_paths = [tuple(n.split('/')) for n in ns]
70
+
71
+ if isinstance(cmd.cmd_name, str) and cmd.cmd_name[0] == '_':
72
+ help_path = None
73
+
74
+ elif isinstance(cmd, CliFunc):
75
+ help_path = ('-', *exec_paths[0])
76
+
77
+ elif isinstance(cmd, CliModule):
78
+ help_path = (cmd.mod_name.partition('.')[0], *exec_paths[0])
79
+
80
+ else:
81
+ raise TypeError(cmd)
82
+
83
+ return CliCmdSet.Entry(
84
+ cmd,
85
+
86
+ exec_paths=exec_paths,
87
+ help_path=help_path,
88
+ )
89
+
90
+ @cached_nullary
91
+ def entries(self) -> ta.Sequence[Entry]:
92
+ return [self._make_entry(c) for c in self._cmds]
93
+
94
+ @cached_nullary
95
+ def exec_tree(self) -> RecCmdMap:
96
+ d: dict = {}
97
+ for e in self.entries():
98
+ for ep in e.exec_paths:
99
+ c = d
100
+ for p in ep[:-1]:
101
+ n = c.setdefault(p, {})
102
+ if not isinstance(n, dict):
103
+ raise NameError(e) # noqa
104
+ c = n
105
+
106
+ h = ep[-1]
107
+ if h in c:
108
+ raise NameError(e) # noqa
109
+
110
+ c[h] = e.cmd
111
+
112
+ return d
113
+
114
+ @cached_nullary
115
+ def help_tree(self) -> RecStrMap:
116
+ d: dict = {}
117
+ for e in self.entries():
118
+ if not e.help_path:
119
+ continue
120
+
121
+ c = d
122
+ for p in e.help_path[:-1]:
123
+ n = c.setdefault(p, {})
124
+ if not isinstance(n, dict):
125
+ raise NameError(e) # noqa
126
+ c = n
127
+
128
+ h = e.help_path[-1]
129
+ if h in c:
130
+ raise NameError(e)
131
+
132
+ if isinstance(e.cmd.cmd_name, str):
133
+ l = [e.cmd.cmd_name]
134
+ else:
135
+ l = list(e.cmd.cmd_name)
136
+
137
+ s = (
138
+ f'{l[0].split("/")[-1]}'
139
+ f'{(" (" + ", ".join(l[1:]) + ")") if len(l) > 1 else ""}'
140
+ )
141
+
142
+ c[h] = s
143
+
144
+ return d
145
+
146
+ class SelectedCmd(ta.NamedTuple):
147
+ cmd: CliCmd
148
+ args: ta.Sequence[str]
149
+
150
+ class InvalidCmd(ta.NamedTuple):
151
+ path: ta.Sequence[str]
152
+
153
+ def select_cmd(self, args: ta.Sequence[str]) -> SelectedCmd | InvalidCmd:
154
+ check.not_isinstance(args, str)
155
+
156
+ d = self.exec_tree()
157
+ for i in range(len(args)):
158
+ n = args[i]
159
+ if n not in d:
160
+ return CliCmdSet.InvalidCmd(args[:i + 1])
161
+
162
+ c = d[n]
163
+
164
+ if isinstance(c, CliCmd):
165
+ return CliCmdSet.SelectedCmd(c, args[i + 1:])
166
+ elif isinstance(c, ta.Mapping):
167
+ d = c
168
+ else:
169
+ raise TypeError(c)
170
+
171
+ return CliCmdSet.InvalidCmd([])
172
+
173
+
174
+ ##
175
+
176
+
41
177
  def _build_arg_parser() -> argparse.ArgumentParser:
42
178
  parser = argparse.ArgumentParser()
43
179
  parser.add_argument('--cli-pkg-root', action='append')
@@ -47,9 +183,7 @@ def _build_arg_parser() -> argparse.ArgumentParser:
47
183
  return parser
48
184
 
49
185
 
50
- def _build_cmd_dct(args: ta.Any) -> ta.Mapping[str, CliCmd]:
51
- ccs: list[CliCmd] = []
52
-
186
+ def _build_cmd_set(args: ta.Any) -> CliCmdSet:
53
187
  ldr = ManifestLoader.from_entry_point(globals())
54
188
 
55
189
  pkgs: list[str] = []
@@ -70,62 +204,49 @@ def _build_cmd_dct(args: ta.Any) -> ta.Mapping[str, CliCmd]:
70
204
  if not pkgs:
71
205
  scan_pkg_root(os.getcwd())
72
206
 
73
- for m in ldr.load(*pkgs, only=[CliModule]):
74
- ccs.append(check.isinstance(m.value, CliModule))
207
+ #
75
208
 
76
- ccs.extend(_CLI_FUNCS)
209
+ lst: list[CliCmd] = []
77
210
 
78
- dct: dict[str, CliCmd] = {}
79
- for cc in ccs:
80
- for cn in [cc.cmd_name] if isinstance(cc.cmd_name, str) else cc.cmd_name:
81
- if cn in dct:
82
- raise NameError(cc)
83
- dct[cn] = cc
211
+ for m in ldr.load(*pkgs, only=[CliModule]):
212
+ lst.append(check.isinstance(m.value, CliModule))
84
213
 
85
- return dct
214
+ lst.extend(_CLI_FUNCS)
86
215
 
216
+ #
87
217
 
88
- def _select_cmd(args: ta.Any, cmds: ta.Mapping[str, CliCmd]) -> CliCmd | int:
89
- cmd = args.cmd
90
- if cmd and cmd in cmds:
91
- return cmds[cmd]
218
+ return CliCmdSet(lst)
92
219
 
220
+
221
+ def _select_cmd(args: ta.Any, cmds: CliCmdSet) -> CliCmdSet.SelectedCmd | int:
93
222
  def print_err(*args, **kwargs): # noqa
94
223
  print(*args, **kwargs, file=sys.stderr)
95
224
 
96
- if cmd:
97
- print_err(f'Invalid command: {cmd}\n')
225
+ if args.cmd:
226
+ sel_cmd = cmds.select_cmd([args.cmd, *args.args])
227
+ if isinstance(sel_cmd, CliCmdSet.SelectedCmd):
228
+ return sel_cmd
229
+ elif isinstance(sel_cmd, CliCmdSet.InvalidCmd):
230
+ print_err(f'Invalid command: {" ".join(sel_cmd.path)}\n')
231
+ else:
232
+ raise TypeError(sel_cmd)
98
233
  rc = 1
99
234
  else:
100
235
  rc = 0
101
236
 
102
- mset = set()
103
- mdct: dict = {}
104
- for cc in cmds.values():
105
- if id(cc) in mset:
106
- continue
107
- mset.add(id(cc))
108
- if isinstance(cc.cmd_name, str) and cc.cmd_name[0] == '_':
109
- continue
110
- if isinstance(cc, CliFunc):
111
- mdct.setdefault('-', []).append(cc)
112
- elif isinstance(cc, CliModule):
113
- mdct.setdefault(cc.mod_name.partition('.')[0], []).append(cc)
114
- else:
115
- raise TypeError(cc)
116
-
117
237
  print_err('Subcommands:\n')
118
- for m, l in sorted(mdct.items(), key=lambda t: (t[0] == '-', t[0])):
119
- print_err(f' {m}')
120
- for cc in sorted(l, key=lambda c: c.primary_name):
121
- if isinstance(cc.cmd_name, str):
122
- print_err(f' {cc.cmd_name}')
238
+
239
+ def rec(d, pfx=''):
240
+ for k, v in sorted(d.items(), key=lambda t: t[0]):
241
+ if isinstance(v, str):
242
+ print_err(pfx + v)
123
243
  else:
124
- print_err(
125
- f' {cc.cmd_name[0]}'
126
- f'{(" (" + ", ".join(cc.cmd_name[1:]) + ")") if len(cc.cmd_name) > 1 else ""}',
127
- )
128
- print_err()
244
+ print_err(pfx + k)
245
+ rec(v, pfx + ' ')
246
+ if not pfx:
247
+ print_err('')
248
+
249
+ rec(cmds.help_tree())
129
250
 
130
251
  return rc
131
252
 
@@ -135,23 +256,23 @@ def _main() -> ta.Any:
135
256
  args = parser.parse_args()
136
257
 
137
258
  def inner():
138
- cmds = _build_cmd_dct(args)
259
+ cmds = _build_cmd_set(args)
139
260
  sel = _select_cmd(args, cmds)
140
261
 
141
- match sel:
142
- case int():
143
- return sel
262
+ if isinstance(sel, int):
263
+ return sel
144
264
 
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
265
+ cmd = sel.cmd
266
+ if isinstance(cmd, CliModule):
267
+ sys.argv = [args.cmd, *(sel.args or ())]
268
+ runpy._run_module_as_main(cmd.mod_name) # type: ignore # noqa
269
+ return 0
149
270
 
150
- case CliFunc() as cf:
151
- return cf.fn(*(args.args or ()))
271
+ elif isinstance(cmd, CliFunc):
272
+ return cmd.fn(*(sel.args or ()))
152
273
 
153
- case _:
154
- raise TypeError(sel)
274
+ else:
275
+ raise TypeError(cmd)
155
276
 
156
277
  if args.cli_debug:
157
278
  from omlish.diag.debug import debugging_on_exception
omdev/findimports.py CHANGED
@@ -78,11 +78,17 @@ def get_import_deps(imps: set[str]) -> set[str]:
78
78
  return {i for i in eimps if whichmod(i) != 'builtin'}
79
79
 
80
80
 
81
- def _main() -> None:
82
- imps = find_imports(*sys.argv[1:])
83
- deps = get_import_deps(imps)
84
- print(chr(10).join(sorted(deps)))
81
+ # @omlish-manifest
82
+ _CLI_MODULE = {'$omdev.cli.types.CliModule': {
83
+ 'cmd_name': 'py/findimports',
84
+ 'mod_name': __name__,
85
+ }}
85
86
 
86
87
 
87
88
  if __name__ == '__main__':
89
+ def _main() -> None:
90
+ imps = find_imports(*sys.argv[1:])
91
+ deps = get_import_deps(imps)
92
+ print(chr(10).join(sorted(deps)))
93
+
88
94
  _main()
omdev/findmagic.py CHANGED
@@ -62,6 +62,13 @@ def find_magic(
62
62
  yield out
63
63
 
64
64
 
65
+ # @omlish-manifest
66
+ _CLI_MODULE = {'$omdev.cli.types.CliModule': {
67
+ 'cmd_name': 'py/findmagic',
68
+ 'mod_name': __name__,
69
+ }}
70
+
71
+
65
72
  if __name__ == '__main__':
66
73
  def _main(argv=None) -> None:
67
74
  import argparse
omdev/manifests/build.py CHANGED
@@ -1,7 +1,7 @@
1
1
  """
2
2
  TODO:
3
3
  - separate build from cli
4
- - parallelize & sort
4
+ - verify classes instantiate
5
5
 
6
6
  See (entry_points):
7
7
  - https://github.com/pytest-dev/pluggy/blob/main/src/pluggy/_manager.py#L405
@@ -6,6 +6,6 @@ _CLI_MODULE = CliModule('precheck', __name__)
6
6
 
7
7
 
8
8
  if __name__ == '__main__':
9
- from .precheck import _main
9
+ from .main import _main
10
10
 
11
11
  _main()
omdev/precheck/lite.py CHANGED
@@ -10,6 +10,7 @@ import typing as ta
10
10
 
11
11
  from omdev import findmagic
12
12
  from omlish import cached
13
+ from omlish.lite.subprocesses import subprocess_maybe_shell_wrap_exec
13
14
 
14
15
  from .base import Precheck
15
16
  from .base import PrecheckContext
@@ -69,10 +70,12 @@ class LitePython8Precheck(Precheck['LitePython8Precheck.Config']):
69
70
  vs: list[Precheck.Violation] = []
70
71
 
71
72
  proc = await asyncio.create_subprocess_exec(
72
- '.venvs/8/bin/python',
73
- '-c',
74
- self._load_file_module_payload(),
75
- fp,
73
+ *subprocess_maybe_shell_wrap_exec(
74
+ '.venvs/8/bin/python',
75
+ '-c',
76
+ self._load_file_module_payload(),
77
+ fp,
78
+ ),
76
79
  stderr=subprocess.PIPE,
77
80
  )
78
81
 
@@ -90,9 +93,11 @@ class LitePython8Precheck(Precheck['LitePython8Precheck.Config']):
90
93
  log.debug('%s: loading module %s', self.__class__.__name__, mod)
91
94
 
92
95
  proc = await asyncio.create_subprocess_exec(
93
- '.venvs/8/bin/python',
94
- '-c',
95
- f'import {mod}',
96
+ *subprocess_maybe_shell_wrap_exec(
97
+ '.venvs/8/bin/python',
98
+ '-c',
99
+ f'import {mod}',
100
+ ),
96
101
  stderr=subprocess.PIPE,
97
102
  )
98
103
 
@@ -2,7 +2,7 @@
2
2
  Tiny pre-commit
3
3
 
4
4
  TODO:
5
- - ! manifests
5
+ - define new prechecks with manifests
6
6
  - global config
7
7
  - global analyses - FilesWithShebang
8
8
  - shebang files have no relative imports
@@ -31,6 +31,7 @@ from .base import Precheck
31
31
  from .base import PrecheckContext
32
32
  from .git import GitBlacklistPrecheck
33
33
  from .lite import LitePython8Precheck
34
+ from .manifests import ManifestsPrecheck
34
35
  from .scripts import ScriptDepsPrecheck
35
36
 
36
37
 
@@ -52,6 +53,7 @@ def _check_cmd(args) -> None:
52
53
  GitBlacklistPrecheck(ctx),
53
54
  ScriptDepsPrecheck(ctx),
54
55
  LitePython8Precheck(ctx),
56
+ ManifestsPrecheck(ctx),
55
57
  ]
56
58
 
57
59
  async def run() -> list[Precheck.Violation]:
@@ -81,16 +83,18 @@ def _build_parser() -> argparse.ArgumentParser:
81
83
 
82
84
  parser_check = subparsers.add_parser('check')
83
85
  parser_check.add_argument('roots', nargs='+')
86
+ parser_check.add_argument('-v', '--verbose', action='store_true')
84
87
  parser_check.set_defaults(func=_check_cmd)
85
88
 
86
89
  return parser
87
90
 
88
91
 
89
92
  def _main(argv: ta.Sequence[str] | None = None) -> None:
90
- logs.configure_standard_logging('INFO')
91
-
92
93
  parser = _build_parser()
93
94
  args = parser.parse_args(argv)
95
+
96
+ logs.configure_standard_logging('DEBUG' if args.verbose else 'INFO')
97
+
94
98
  if not getattr(args, 'func', None):
95
99
  parser.print_help()
96
100
  else:
@@ -0,0 +1,26 @@
1
+ import dataclasses as dc
2
+ import typing as ta
3
+
4
+ from ..manifests.load import ManifestLoader
5
+ from .base import Precheck
6
+ from .base import PrecheckContext
7
+
8
+
9
+ ##
10
+
11
+
12
+ class ManifestsPrecheck(Precheck['ManifestsPrecheck.Config']):
13
+ @dc.dataclass(frozen=True)
14
+ class Config(Precheck.Config):
15
+ pass
16
+
17
+ def __init__(self, context: PrecheckContext, config: Config = Config()) -> None:
18
+ super().__init__(context, config)
19
+
20
+ async def run(self) -> ta.AsyncGenerator[Precheck.Violation, None]:
21
+ for src_root in self._context.src_roots:
22
+ ml = ManifestLoader()
23
+ try:
24
+ ml.load(src_root)
25
+ except Exception as e: # noqa
26
+ yield Precheck.Violation(self, f'Error loading manifest for {src_root}: {e!r}')
omdev/scripts/execrss.py CHANGED
@@ -10,7 +10,7 @@ def _get_rss() -> int:
10
10
 
11
11
  # @omlish-manifest
12
12
  _CLI_MODULE = {'$omdev.cli.types.CliModule': {
13
- 'cmd_name': 'execrss',
13
+ 'cmd_name': 'py/execrss',
14
14
  'mod_name': __name__,
15
15
  }}
16
16
 
omdev/scripts/exectime.py CHANGED
@@ -6,7 +6,7 @@ import time
6
6
 
7
7
  # @omlish-manifest
8
8
  _CLI_MODULE = {'$omdev.cli.types.CliModule': {
9
- 'cmd_name': 'exectime',
9
+ 'cmd_name': 'py/exectime',
10
10
  'mod_name': __name__,
11
11
  }}
12
12
 
@@ -480,7 +480,7 @@ class SqliteWriter:
480
480
 
481
481
  # @omlish-manifest
482
482
  _CLI_MODULE = {'$omdev.cli.types.CliModule': {
483
- 'cmd_name': 'importtrace',
483
+ 'cmd_name': 'py/importtrace',
484
484
  'mod_name': __name__,
485
485
  }}
486
486
 
@@ -170,6 +170,13 @@ def find_magic(
170
170
  yield out
171
171
 
172
172
 
173
+ # # @omlish-manifest
174
+ # _CLI_MODULE = {'$omdev.cli.types.CliModule': {
175
+ # 'cmd_name': 'py/findmagic',
176
+ # 'mod_name': __name__,
177
+ # }}
178
+
179
+
173
180
  ########################################
174
181
  # ../../git.py
175
182
 
omdev/tools/importscan.py CHANGED
@@ -164,7 +164,7 @@ def run(
164
164
 
165
165
 
166
166
  # @omlish-manifest
167
- _CLI_MODULE = CliModule('importscan', __name__)
167
+ _CLI_MODULE = CliModule('py/importscan', __name__)
168
168
 
169
169
 
170
170
  def _main() -> None:
omdev/tools/mkrelimp.py CHANGED
@@ -146,7 +146,7 @@ class Processor:
146
146
 
147
147
 
148
148
  # @omlish-manifest
149
- _CLI_MODULE = CliModule('mkrelimp', __name__)
149
+ _CLI_MODULE = CliModule('py/mkrelimp', __name__)
150
150
 
151
151
 
152
152
  def _main() -> None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omdev
3
- Version: 0.0.0.dev78
3
+ Version: 0.0.0.dev80
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.dev78
15
+ Requires-Dist: omlish ==0.0.0.dev80
16
16
  Provides-Extra: all
17
17
  Requires-Dist: black ~=24.10 ; extra == 'all'
18
18
  Requires-Dist: pycparser ~=2.22 ; extra == 'all'
@@ -1,11 +1,11 @@
1
- omdev/.manifests.json,sha256=qqGdjl5ipGAzn3N24XuhpvfczMlYD__3pV1gFHXw4AY,5228
1
+ omdev/.manifests.json,sha256=TmB_ctSLXsOq5UGeoiGLy5FoI490OCjT2Q2kRWyWG9g,5993
2
2
  omdev/__about__.py,sha256=do_MjpnIpB_DX4GL4VV9gFQzs6bkoyDIYu29yB3rYxw,1131
3
3
  omdev/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- omdev/bracepy.py,sha256=HwBK5XmlOsF_juTel25fRLJK9vHSJCWXuCc-OZlevRQ,2619
5
- omdev/classdot.py,sha256=K0YMTngaC6uuEKhDb95tFzW33Re_YEdgIWBBeze4PTI,1628
4
+ omdev/bracepy.py,sha256=I8EdqtDvxzAi3I8TuMEW-RBfwXfqKbwp06CfOdj3L1o,2743
5
+ omdev/classdot.py,sha256=YOvgy6x295I_8NKBbBlRVd3AN7Osirm_Lqt4Wj0j9rY,1631
6
6
  omdev/cmake.py,sha256=Diy2ry65806dQP125DAstD3w46z_wszMH7PwC2-6iik,4578
7
- omdev/findimports.py,sha256=P8v4I1tm6g-PEWJiNwAKxErvWwL-Nop83vAuwq1kR5A,2246
8
- omdev/findmagic.py,sha256=DhBYHHP_dzwM5pIh21xnQPnkZ2YmAXCjithsr7X0ScU,2357
7
+ omdev/findimports.py,sha256=2t8QP852saEEJFeXySEzhi_nxRSxghlkXz2jVdvy08M,2392
8
+ omdev/findmagic.py,sha256=XoKPGjSM0qn1PCiiBPwfTHkpqJYQJmLW8v_4QFJ16Mk,2486
9
9
  omdev/git.py,sha256=riM2KqSpQPC3N89uipd7Vm3kVgv4EYYDBU9tV1Z8juM,2208
10
10
  omdev/imgur.py,sha256=il12R3t19tALolteYCZywvcdQUEOcgvPyUYgWtKiqt4,2993
11
11
  omdev/revisions.py,sha256=U657hf4zeEN32y3g4CzqCAodx_HlfkHj2cIIKALNFDo,5009
@@ -14,7 +14,7 @@ omdev/tokens.py,sha256=GusxQ1Cd_eiScuR8XTTtc9QFhOgYviYGBZmFnn3Hj7s,756
14
14
  omdev/wheelfile.py,sha256=yfupGcGkbFlmzGzKU64k_vmOKpaKnUlDWxeGn2KdekU,10005
15
15
  omdev/amalg/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
16
  omdev/amalg/__main__.py,sha256=h94M-VqZ3AFBU2a8zOsjeKK7RF6uINhTHl6OiGbVMgw,163
17
- omdev/amalg/amalg.py,sha256=8tsrsKpgB54aOZ7CPQ6EoUIUYXylMvJpDOOJwbvSZ5E,14339
17
+ omdev/amalg/amalg.py,sha256=v_4Y9b6eUWUArhIRnTkboe8ZNMr_mHJTWi8GajdDvUs,15139
18
18
  omdev/antlr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
19
  omdev/antlr/consts.py,sha256=8pR6r0m0P3hAiyiAoJZ-nptd2GYbZ98mxwPL9cpaRuw,279
20
20
  omdev/antlr/gen.py,sha256=QnPyVWUrJYqHoOc3XsXA8fJdoiwAj6pyUwdG-DVrIeA,2953
@@ -63,7 +63,7 @@ omdev/cli/__main__.py,sha256=mOJpgc07o0r5luQ1DlX4tk2PqZkgmbwPbdzJ3KmtjgQ,138
63
63
  omdev/cli/_pathhack.py,sha256=MCkajFbzP55Nak4DAy2s-4WH_ol15ejyTatvhLfne90,1478
64
64
  omdev/cli/clicli.py,sha256=ShTlK2vjFPqnyF9SPTwXd4nRyb6XjCVPQIT4PTGdTL4,2879
65
65
  omdev/cli/install.py,sha256=C-W171YlIHt4Cfok-nWSMbHwWhqF_PFqq2HixFttYx8,4460
66
- omdev/cli/main.py,sha256=fQL-KdKZDmw00d8vtgxGmUc9Pp3dnhW1BW-Pzu6JPX0,4172
66
+ omdev/cli/main.py,sha256=nD3bW3MkI0KuDSLpX_PTnl-lBnm4hIxVqczvvMHtupo,7058
67
67
  omdev/cli/managers.py,sha256=BV98_n30Jj63OJrFgRoVZRfICxMLXEZKoEn4rMj9LV4,1160
68
68
  omdev/cli/types.py,sha256=bqKw9SbtBtAip2vF9v4khh0CqKG6LBr6n9VzWBz7AJE,474
69
69
  omdev/interp/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
@@ -77,7 +77,7 @@ omdev/interp/standalone.py,sha256=XcltiL7ypcfV89C82_3knQ3Kx7aW4wnnxf2056ZXC3A,77
77
77
  omdev/interp/system.py,sha256=bI-JhX4GVJqW7wMxnIa-DGJWnCLmFcIsnl9pc1RGY2g,3513
78
78
  omdev/interp/types.py,sha256=EMN3StEMkFoQAMUIZd7JYL4uUWqzFGY-2hTL8EBznYM,2437
79
79
  omdev/manifests/__init__.py,sha256=P2B0dpT8D7l5lJwRGPA92IcQj6oeXfd90X5-q9BJrKg,51
80
- omdev/manifests/build.py,sha256=65Bw8gc8avQdXveKqO6hG25LQjdkXknY3cypojmw7Js,10823
80
+ omdev/manifests/build.py,sha256=omRyKmj4NhZ6PrhmoJIKYCTYaU1OB7bZEtfso29hIEo,10831
81
81
  omdev/manifests/load.py,sha256=LtEsluDdd8CkNGj0QGBxee3twBn095Fru0xz2mtr7uk,4788
82
82
  omdev/manifests/types.py,sha256=Jv6PAdVLPb9Hh4y6vDhPlWuMNBBViin1bC_u83jfsH4,234
83
83
  omdev/mypy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -88,11 +88,12 @@ omdev/packaging/requires.py,sha256=VQ-rRDK4_w2R-0xMTbLCwhvZwkO-qgS8uEMbRhNmfOw,1
88
88
  omdev/packaging/specifiers.py,sha256=6Odf9e6farwlPRsD_YqwTfYKG-BXn_dIcKtqfkhfodI,17432
89
89
  omdev/packaging/versions.py,sha256=ei2eopEsJq3zSMJmezK1nzZgikgCdxFtnF3f69nCRZQ,12246
90
90
  omdev/precheck/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
91
- omdev/precheck/__main__.py,sha256=p8jRkwErGndtO4PO4L5nAC8sqmJ0sW3u-rq8p1GN3ec,169
91
+ omdev/precheck/__main__.py,sha256=UEuS4z5-heIrwTtB-ONe1KeXJdqj8tYXMqWMpuO10so,165
92
92
  omdev/precheck/base.py,sha256=a_lGoFM-QhL8u8XDUYFhb-feEyfPbP4j8lcmNO51sHY,732
93
93
  omdev/precheck/git.py,sha256=APC5Ln7x0zDrQiGPRWPsBcVJK3vWhbU-brqR5M63JQA,849
94
- omdev/precheck/lite.py,sha256=MLeDZP2UexNZzYTcSx4-LrhA97kCKn8tXrGkhsJb6I0,3649
95
- omdev/precheck/precheck.py,sha256=Boe3zbK0RXCGzw9H_OsyqJ4yMETuyrwy8P4UFAZQcTY,2477
94
+ omdev/precheck/lite.py,sha256=d8D-BY-Z0rqQigQ_aR9QXxdB3EBCHJc7WgBJngGiEiE,3871
95
+ omdev/precheck/main.py,sha256=2YizDZSDhMeQaZKVH83s99pBmtOUL9B-8dXwIcw6fQQ,2674
96
+ omdev/precheck/manifests.py,sha256=YfXqt6u0hlFXY0QkBMec6V_6Y9T4eCVAmrJDkQkB13U,774
96
97
  omdev/precheck/scripts.py,sha256=qq6MXkxgrYngPg5pWnXH4uRSuRkP3mFqbeml1UmvGBc,1265
97
98
  omdev/pyproject/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
98
99
  omdev/pyproject/__main__.py,sha256=gn3Rl1aYPYdiTtEqa9ifi0t-e4ZwPY0vhJ4UXvYdJDY,165
@@ -103,27 +104,27 @@ omdev/pyproject/pkg.py,sha256=rNKzJOIgPDrtT2i14Pebldoboz45w00sKb5l_kYFaRI,14562
103
104
  omdev/pyproject/reqs.py,sha256=8feZ71YnGzwKbLK4zO28CDQeNcZIIuq6cnkBhs6M-7E,2406
104
105
  omdev/scripts/__init__.py,sha256=MKCvUAEQwsIvwLixwtPlpBqmkMXLCnjjXyAXvVpDwVk,91
105
106
  omdev/scripts/bumpversion.py,sha256=Kn7fo73Hs8uJh3Hi3EIyLOlzLPWAC6dwuD_lZ3cIzuY,1064
106
- omdev/scripts/execrss.py,sha256=d6purJqU99OkMcNxCS1kG2CMfSsw7wjnvBQW7SjyJ70,448
107
- omdev/scripts/exectime.py,sha256=LRVIJsnvGYUqH-zfCdFnrQCZv1KLXJPtWBWplXMDwhI,407
108
- omdev/scripts/importtrace.py,sha256=4ozdphT4VuP8L0kE0HmGMyWaWHnXg1KEukbET4pFgJU,14064
107
+ omdev/scripts/execrss.py,sha256=hJTWBig_-XqKIj1DphYTfeVDtdQTM1XUl-Hvzs2x9iY,451
108
+ omdev/scripts/exectime.py,sha256=dBdn3KV2jR6tCrzGvb9dTl2uGe2vNpLxmHMtExmnaiM,410
109
+ omdev/scripts/importtrace.py,sha256=Jbo3Yk2RAbE8_tJ97iTcVNpoxCJxrRb2tl1W_CV3NG0,14067
109
110
  omdev/scripts/interp.py,sha256=2poCQ_45tO0-X16KeoxiAyuTfltSjnPETejlYEm9VY4,71527
110
- omdev/scripts/pyproject.py,sha256=nWbnMyGwrfzcTcnvUFGP9wxIu3rlUyxQYhkq64UXIrA,158084
111
+ omdev/scripts/pyproject.py,sha256=wtmF5ji8fHw2qzc1aEve09Ozv0ncuZmTQ8IbKCJVAQ0,158223
111
112
  omdev/toml/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
112
113
  omdev/toml/parser.py,sha256=84bn09uhYHwQGyfww6Rw6y1RxPAE_HDltODOSakcqDM,29186
113
114
  omdev/toml/writer.py,sha256=lk3on3YXVbWuLJa-xsOzOhs1bBAT1vXqw4mBbluZl_w,3040
114
115
  omdev/tools/__init__.py,sha256=iVJAOQ0viGTQOm0DLX4uZLro-9jOioYJGLg9s0kDx1A,78
115
116
  omdev/tools/dockertools.py,sha256=k2BrVvFYwyGov064CPHd_HWo9aqR1zHc2UeEsVwPth4,6827
116
117
  omdev/tools/gittools.py,sha256=1Oa2AgdZIJZ2eusso9yFzkd9zLWH3d4lTiVFzwg0uDM,3808
117
- omdev/tools/importscan.py,sha256=vxOMdAABShqt5-G3n6DGHopCZ5uGgciThY0MCa5W0mA,4066
118
- omdev/tools/mkrelimp.py,sha256=fwt4GWzenuLNVtzdK2uaJJTSuJbUVJZquF5adwAwlPg,4051
118
+ omdev/tools/importscan.py,sha256=QeGjR3UGcuuuDUiisFuAXWHlcKJScGxGEcU6tfOh2CM,4069
119
+ omdev/tools/mkrelimp.py,sha256=wsJAjTIf3nqcSfnT9TkDpS1VUOoM9W2Az5tZdWuzyLM,4054
119
120
  omdev/tools/nbtools.py,sha256=M8Xi_gfZdlahnyFLtp0RBgYZPSHWQStMMDYZc71Zync,3494
120
121
  omdev/tools/piptools.py,sha256=-jR5q3w4sHqntxCLExFCBNIARB788FUsAbJ62PK2sBU,2774
121
122
  omdev/tools/proftools.py,sha256=8ZU9x_Dq8eT2ZFwU9sJpDIvxcIn9qBc8y2ELKPb5e5M,1382
122
123
  omdev/tools/rsttool.py,sha256=suwsfseUf8GH8rYmYygTUdif-Jk_bX1g9fYRLXaKkmM,1340
123
124
  omdev/tools/sqlrepl.py,sha256=tmFZh80-xsGM62dyQ7_UGLebChrj7IHbIPYBWDJMgVk,5741
124
- omdev-0.0.0.dev78.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
125
- omdev-0.0.0.dev78.dist-info/METADATA,sha256=98R5viqCGLx0896u-4zH3LyIN55taK5qAQNgv2XGoQg,1492
126
- omdev-0.0.0.dev78.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
127
- omdev-0.0.0.dev78.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
128
- omdev-0.0.0.dev78.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
129
- omdev-0.0.0.dev78.dist-info/RECORD,,
125
+ omdev-0.0.0.dev80.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
126
+ omdev-0.0.0.dev80.dist-info/METADATA,sha256=68sUTkl9Uc5f4dvq8nA5q3OQ7eDcDDh0MPClMBFBAps,1492
127
+ omdev-0.0.0.dev80.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
128
+ omdev-0.0.0.dev80.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
129
+ omdev-0.0.0.dev80.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
130
+ omdev-0.0.0.dev80.dist-info/RECORD,,