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 +42 -6
- omdev/amalg/amalg.py +31 -1
- omdev/bracepy.py +7 -0
- omdev/classdot.py +1 -1
- omdev/cli/main.py +177 -56
- omdev/findimports.py +10 -4
- omdev/findmagic.py +7 -0
- omdev/manifests/build.py +1 -1
- omdev/precheck/__main__.py +1 -1
- omdev/precheck/lite.py +12 -7
- omdev/precheck/{precheck.py → main.py} +7 -3
- omdev/precheck/manifests.py +26 -0
- omdev/scripts/execrss.py +1 -1
- omdev/scripts/exectime.py +1 -1
- omdev/scripts/importtrace.py +1 -1
- omdev/scripts/pyproject.py +7 -0
- omdev/tools/importscan.py +1 -1
- omdev/tools/mkrelimp.py +1 -1
- {omdev-0.0.0.dev78.dist-info → omdev-0.0.0.dev80.dist-info}/METADATA +2 -2
- {omdev-0.0.0.dev78.dist-info → omdev-0.0.0.dev80.dist-info}/RECORD +24 -23
- {omdev-0.0.0.dev78.dist-info → omdev-0.0.0.dev80.dist-info}/LICENSE +0 -0
- {omdev-0.0.0.dev78.dist-info → omdev-0.0.0.dev80.dist-info}/WHEEL +0 -0
- {omdev-0.0.0.dev78.dist-info → omdev-0.0.0.dev80.dist-info}/entry_points.txt +0 -0
- {omdev-0.0.0.dev78.dist-info → omdev-0.0.0.dev80.dist-info}/top_level.txt +0 -0
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
|
-
|
|
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
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
|
|
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
|
-
|
|
74
|
-
ccs.append(check.isinstance(m.value, CliModule))
|
|
207
|
+
#
|
|
75
208
|
|
|
76
|
-
|
|
209
|
+
lst: list[CliCmd] = []
|
|
77
210
|
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
|
|
214
|
+
lst.extend(_CLI_FUNCS)
|
|
86
215
|
|
|
216
|
+
#
|
|
87
217
|
|
|
88
|
-
|
|
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
|
-
|
|
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
|
-
|
|
119
|
-
|
|
120
|
-
for
|
|
121
|
-
if isinstance(
|
|
122
|
-
print_err(
|
|
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
|
-
|
|
126
|
-
|
|
127
|
-
)
|
|
128
|
-
|
|
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 =
|
|
259
|
+
cmds = _build_cmd_set(args)
|
|
139
260
|
sel = _select_cmd(args, cmds)
|
|
140
261
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
return sel
|
|
262
|
+
if isinstance(sel, int):
|
|
263
|
+
return sel
|
|
144
264
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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
|
-
|
|
151
|
-
|
|
271
|
+
elif isinstance(cmd, CliFunc):
|
|
272
|
+
return cmd.fn(*(sel.args or ()))
|
|
152
273
|
|
|
153
|
-
|
|
154
|
-
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
omdev/precheck/__main__.py
CHANGED
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
-
-
|
|
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
omdev/scripts/exectime.py
CHANGED
omdev/scripts/importtrace.py
CHANGED
omdev/scripts/pyproject.py
CHANGED
|
@@ -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
omdev/tools/mkrelimp.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: omdev
|
|
3
|
-
Version: 0.0.0.
|
|
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.
|
|
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=
|
|
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=
|
|
5
|
-
omdev/classdot.py,sha256=
|
|
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=
|
|
8
|
-
omdev/findmagic.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
95
|
-
omdev/precheck/
|
|
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=
|
|
107
|
-
omdev/scripts/exectime.py,sha256=
|
|
108
|
-
omdev/scripts/importtrace.py,sha256=
|
|
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=
|
|
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=
|
|
118
|
-
omdev/tools/mkrelimp.py,sha256=
|
|
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.
|
|
125
|
-
omdev-0.0.0.
|
|
126
|
-
omdev-0.0.0.
|
|
127
|
-
omdev-0.0.0.
|
|
128
|
-
omdev-0.0.0.
|
|
129
|
-
omdev-0.0.0.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|