omdev 0.0.0.dev59__py3-none-any.whl → 0.0.0.dev61__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 +1 -1
- omdev/cli/__main__.py +3 -1
- omdev/cli/main.py +84 -50
- omdev/secrets.py +2 -2
- omdev/tools/gittools.py +24 -14
- {omdev-0.0.0.dev59.dist-info → omdev-0.0.0.dev61.dist-info}/METADATA +2 -2
- {omdev-0.0.0.dev59.dist-info → omdev-0.0.0.dev61.dist-info}/RECORD +11 -11
- {omdev-0.0.0.dev59.dist-info → omdev-0.0.0.dev61.dist-info}/LICENSE +0 -0
- {omdev-0.0.0.dev59.dist-info → omdev-0.0.0.dev61.dist-info}/WHEEL +0 -0
- {omdev-0.0.0.dev59.dist-info → omdev-0.0.0.dev61.dist-info}/entry_points.txt +0 -0
- {omdev-0.0.0.dev59.dist-info → omdev-0.0.0.dev61.dist-info}/top_level.txt +0 -0
omdev/.manifests.json
CHANGED
omdev/cli/__main__.py
CHANGED
omdev/cli/main.py
CHANGED
|
@@ -38,30 +38,42 @@ _CLI_FUNCS: ta.Sequence[CliFunc] = [
|
|
|
38
38
|
##
|
|
39
39
|
|
|
40
40
|
|
|
41
|
-
def
|
|
42
|
-
|
|
41
|
+
def _build_arg_parser() -> argparse.ArgumentParser:
|
|
42
|
+
parser = argparse.ArgumentParser()
|
|
43
|
+
parser.add_argument('--cli-pkg-root', action='append')
|
|
44
|
+
parser.add_argument('cmd', nargs='?')
|
|
45
|
+
parser.add_argument('args', nargs=argparse.REMAINDER)
|
|
46
|
+
return parser
|
|
43
47
|
|
|
44
|
-
|
|
48
|
+
|
|
49
|
+
def _build_cmd_dct(args: ta.Any) -> ta.Mapping[str, CliCmd]:
|
|
50
|
+
ccs: list[CliCmd] = []
|
|
45
51
|
|
|
46
52
|
ldr = ManifestLoader.from_entry_point(globals())
|
|
47
53
|
|
|
48
|
-
pkgs =
|
|
54
|
+
pkgs: list[str] = []
|
|
49
55
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
for n in os.listdir(
|
|
53
|
-
if os.path.isdir(n) and os.path.exists(os.path.join(
|
|
56
|
+
def scan_pkg_root(r: str) -> None:
|
|
57
|
+
r = os.path.expanduser(r)
|
|
58
|
+
for n in os.listdir(r):
|
|
59
|
+
if os.path.isdir(p := os.path.join(r, n)) and os.path.exists(os.path.join(p, '__init__.py')):
|
|
54
60
|
pkgs.append(n)
|
|
55
61
|
|
|
62
|
+
if args.cli_pkg_root:
|
|
63
|
+
for r in args.cli_pkg_root:
|
|
64
|
+
scan_pkg_root(r)
|
|
65
|
+
|
|
66
|
+
else:
|
|
67
|
+
pkgs.extend(ldr.discover())
|
|
68
|
+
|
|
69
|
+
if not pkgs:
|
|
70
|
+
scan_pkg_root(os.getcwd())
|
|
71
|
+
|
|
56
72
|
for m in ldr.load(*pkgs, only=[CliModule]):
|
|
57
73
|
ccs.append(check.isinstance(m.value, CliModule))
|
|
58
74
|
|
|
59
|
-
#
|
|
60
|
-
|
|
61
75
|
ccs.extend(_CLI_FUNCS)
|
|
62
76
|
|
|
63
|
-
#
|
|
64
|
-
|
|
65
77
|
dct: dict[str, CliCmd] = {}
|
|
66
78
|
for cc in ccs:
|
|
67
79
|
for cn in [cc.cmd_name] if isinstance(cc.cmd_name, str) else cc.cmd_name:
|
|
@@ -69,53 +81,75 @@ def _main() -> None:
|
|
|
69
81
|
raise NameError(cc)
|
|
70
82
|
dct[cn] = cc
|
|
71
83
|
|
|
72
|
-
|
|
84
|
+
return dct
|
|
73
85
|
|
|
74
|
-
parser = argparse.ArgumentParser()
|
|
75
|
-
parser.add_argument('cmd', nargs='?', choices=dct.keys())
|
|
76
|
-
parser.add_argument('args', nargs=argparse.REMAINDER)
|
|
77
86
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
87
|
+
def _select_cmd(args: ta.Any, cmds: ta.Mapping[str, CliCmd]) -> CliCmd | int:
|
|
88
|
+
cmd = args.cmd
|
|
89
|
+
if cmd and cmd in cmds:
|
|
90
|
+
return cmds[cmd]
|
|
91
|
+
|
|
92
|
+
def print_err(*args, **kwargs): # noqa
|
|
93
|
+
print(*args, **kwargs, file=sys.stderr)
|
|
94
|
+
|
|
95
|
+
if cmd:
|
|
96
|
+
print_err(f'Invalid command: {cmd}\n')
|
|
97
|
+
rc = 1
|
|
98
|
+
else:
|
|
99
|
+
rc = 0
|
|
100
|
+
|
|
101
|
+
mset = set()
|
|
102
|
+
mdct: dict = {}
|
|
103
|
+
for cc in cmds.values():
|
|
104
|
+
if id(cc) in mset:
|
|
105
|
+
continue
|
|
106
|
+
mset.add(id(cc))
|
|
107
|
+
if isinstance(cc.cmd_name, str) and cc.cmd_name[0] == '_':
|
|
108
|
+
continue
|
|
109
|
+
if isinstance(cc, CliFunc):
|
|
110
|
+
mdct.setdefault('-', []).append(cc)
|
|
111
|
+
elif isinstance(cc, CliModule):
|
|
112
|
+
mdct.setdefault(cc.mod_name.partition('.')[0], []).append(cc)
|
|
113
|
+
else:
|
|
114
|
+
raise TypeError(cc)
|
|
115
|
+
|
|
116
|
+
print_err('Subcommands:\n')
|
|
117
|
+
for m, l in sorted(mdct.items(), key=lambda t: (t[0] == '-', t[0])):
|
|
118
|
+
print_err(f' {m}')
|
|
119
|
+
for cc in sorted(l, key=lambda c: c.primary_name):
|
|
120
|
+
if isinstance(cc.cmd_name, str):
|
|
121
|
+
print_err(f' {cc.cmd_name}')
|
|
88
122
|
else:
|
|
89
|
-
|
|
123
|
+
print_err(
|
|
124
|
+
f' {cc.cmd_name[0]}'
|
|
125
|
+
f'{(" (" + ", ".join(cc.cmd_name[1:]) + ")") if len(cc.cmd_name) > 1 else ""}',
|
|
126
|
+
)
|
|
127
|
+
print_err()
|
|
90
128
|
|
|
91
|
-
|
|
92
|
-
for m, l in sorted(mdct.items(), key=lambda t: (t[0] == '-', t[0])):
|
|
93
|
-
print(f' {m}')
|
|
94
|
-
for cc in sorted(l, key=lambda c: c.primary_name):
|
|
95
|
-
if isinstance(cc.cmd_name, str):
|
|
96
|
-
print(f' {cc.cmd_name}')
|
|
97
|
-
else:
|
|
98
|
-
print(
|
|
99
|
-
f' {cc.cmd_name[0]}'
|
|
100
|
-
f'{(" (" + ", ".join(cc.cmd_name[1:]) + ")") if len(cc.cmd_name) > 1 else ""}',
|
|
101
|
-
)
|
|
102
|
-
print()
|
|
103
|
-
return
|
|
129
|
+
return rc
|
|
104
130
|
|
|
105
|
-
#
|
|
106
131
|
|
|
107
|
-
|
|
132
|
+
def _main() -> ta.Any:
|
|
133
|
+
parser = _build_arg_parser()
|
|
134
|
+
args = parser.parse_args()
|
|
135
|
+
cmds = _build_cmd_dct(args)
|
|
136
|
+
sel = _select_cmd(args, cmds)
|
|
108
137
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
138
|
+
match sel:
|
|
139
|
+
case int():
|
|
140
|
+
return sel
|
|
112
141
|
|
|
113
|
-
|
|
114
|
-
|
|
142
|
+
case CliModule() as cm:
|
|
143
|
+
sys.argv = [args.cmd, *(args.args or ())]
|
|
144
|
+
runpy._run_module_as_main(cm.mod_name) # type: ignore # noqa
|
|
145
|
+
return 0
|
|
115
146
|
|
|
116
|
-
|
|
117
|
-
|
|
147
|
+
case CliFunc() as cf:
|
|
148
|
+
return cf.fn(*(args.args or ()))
|
|
149
|
+
|
|
150
|
+
case _:
|
|
151
|
+
raise TypeError(sel)
|
|
118
152
|
|
|
119
153
|
|
|
120
154
|
if __name__ == '__main__':
|
|
121
|
-
_main()
|
|
155
|
+
sys.exit(rc if isinstance(rc := _main(), int) else 0)
|
omdev/secrets.py
CHANGED
|
@@ -5,12 +5,12 @@ import yaml
|
|
|
5
5
|
from omlish import secrets as sec
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
SECRETS_FILE = os.getenv('SECRETS_FILE', '~/Dropbox/.dotfiles/secrets.yml')
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
def load_secrets() -> sec.Secrets:
|
|
12
12
|
dct: dict[str, sec.Secret] = {}
|
|
13
|
-
with open(
|
|
13
|
+
with open(os.path.expanduser(SECRETS_FILE)) as f:
|
|
14
14
|
for k, v in yaml.safe_load(f).items():
|
|
15
15
|
if isinstance(v, str):
|
|
16
16
|
dct[k] = sec.Secret(key=k, value=v)
|
omdev/tools/gittools.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import os
|
|
2
2
|
import re
|
|
3
3
|
import subprocess
|
|
4
|
+
import urllib.parse
|
|
4
5
|
|
|
5
6
|
from omlish import argparse as ap
|
|
6
7
|
from omlish import logs
|
|
@@ -36,29 +37,38 @@ class Cli(ap.Cli):
|
|
|
36
37
|
accepts_unknown=True,
|
|
37
38
|
)
|
|
38
39
|
def clone(self) -> None:
|
|
39
|
-
|
|
40
|
+
out_dir: str
|
|
41
|
+
|
|
42
|
+
if (m := self._GITHUB_PAT.fullmatch(self.args.repo)):
|
|
43
|
+
user = m.group('user')
|
|
44
|
+
repo = m.group('repo')
|
|
45
|
+
|
|
46
|
+
os.makedirs(user, 0o755, exist_ok=True)
|
|
47
|
+
|
|
40
48
|
subprocess.check_call([
|
|
41
49
|
'git',
|
|
42
50
|
'clone',
|
|
43
51
|
*self.unknown_args,
|
|
44
52
|
*self.args.args,
|
|
45
|
-
|
|
53
|
+
f'https://github.com/{user}/{repo}.git',
|
|
54
|
+
os.path.join(user, repo),
|
|
46
55
|
])
|
|
47
|
-
return
|
|
48
56
|
|
|
49
|
-
|
|
50
|
-
|
|
57
|
+
out_dir = os.path.join(user, repo)
|
|
58
|
+
|
|
59
|
+
else:
|
|
60
|
+
parsed = urllib.parse.urlparse(self.args.repo)
|
|
61
|
+
out_dir = parsed.path.split('/')[-1]
|
|
51
62
|
|
|
52
|
-
|
|
63
|
+
subprocess.check_call([
|
|
64
|
+
'git',
|
|
65
|
+
'clone',
|
|
66
|
+
*self.unknown_args,
|
|
67
|
+
*self.args.args,
|
|
68
|
+
self.args.repo,
|
|
69
|
+
])
|
|
53
70
|
|
|
54
|
-
|
|
55
|
-
'git',
|
|
56
|
-
'clone',
|
|
57
|
-
*self.unknown_args,
|
|
58
|
-
*self.args.args,
|
|
59
|
-
f'https://github.com/{user}/{repo}.git',
|
|
60
|
-
os.path.join(user, repo),
|
|
61
|
-
])
|
|
71
|
+
print(out_dir)
|
|
62
72
|
|
|
63
73
|
|
|
64
74
|
# @omlish-manifest
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: omdev
|
|
3
|
-
Version: 0.0.0.
|
|
3
|
+
Version: 0.0.0.dev61
|
|
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.dev61
|
|
16
16
|
Provides-Extra: all
|
|
17
17
|
Requires-Dist: pycparser ~=2.22 ; extra == 'all'
|
|
18
18
|
Requires-Dist: cffi ~=1.17 ; extra == 'all'
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
omdev/.manifests.json,sha256=
|
|
1
|
+
omdev/.manifests.json,sha256=cFtziwWnzyiOPhVOkivx6peBOopFr4Umfqz1NTK9M_Y,4476
|
|
2
2
|
omdev/__about__.py,sha256=LqSNNFFcT84xW3W8fIOJ78kPYJKFLIXZyDX-AJREvN0,1005
|
|
3
3
|
omdev/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
4
|
omdev/bracepy.py,sha256=HwBK5XmlOsF_juTel25fRLJK9vHSJCWXuCc-OZlevRQ,2619
|
|
@@ -8,7 +8,7 @@ omdev/findimports.py,sha256=P8v4I1tm6g-PEWJiNwAKxErvWwL-Nop83vAuwq1kR5A,2246
|
|
|
8
8
|
omdev/findmagic.py,sha256=DhBYHHP_dzwM5pIh21xnQPnkZ2YmAXCjithsr7X0ScU,2357
|
|
9
9
|
omdev/git.py,sha256=riM2KqSpQPC3N89uipd7Vm3kVgv4EYYDBU9tV1Z8juM,2208
|
|
10
10
|
omdev/revisions.py,sha256=U657hf4zeEN32y3g4CzqCAodx_HlfkHj2cIIKALNFDo,5009
|
|
11
|
-
omdev/secrets.py,sha256=
|
|
11
|
+
omdev/secrets.py,sha256=MBCTWMxZbKS3FmvUYT9I3Yd_TfIBx5qXIJHprrNKKyo,437
|
|
12
12
|
omdev/tokens.py,sha256=GusxQ1Cd_eiScuR8XTTtc9QFhOgYviYGBZmFnn3Hj7s,756
|
|
13
13
|
omdev/wheelfile.py,sha256=yfupGcGkbFlmzGzKU64k_vmOKpaKnUlDWxeGn2KdekU,10005
|
|
14
14
|
omdev/amalg/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -58,10 +58,10 @@ omdev/cexts/_distutils/compilers/ccompiler.py,sha256=cTs88qrvj0hBVXHfemSDE_du_nE
|
|
|
58
58
|
omdev/cexts/_distutils/compilers/options.py,sha256=H7r5IcLvga5Fs3jjXWIT-6ap3JBduXRKgtpDmSGCZxs,3818
|
|
59
59
|
omdev/cexts/_distutils/compilers/unixccompiler.py,sha256=o1h8QuyupLntv4F21_XjzAZmCiwwxJuTmOirvBSL-Qw,15419
|
|
60
60
|
omdev/cli/__init__.py,sha256=V_l6VP1SZMlJbO-8CJwSuO9TThOy2S_oaPepNYgIrbE,37
|
|
61
|
-
omdev/cli/__main__.py,sha256=
|
|
61
|
+
omdev/cli/__main__.py,sha256=mOJpgc07o0r5luQ1DlX4tk2PqZkgmbwPbdzJ3KmtjgQ,138
|
|
62
62
|
omdev/cli/clicli.py,sha256=rQ9-F9XI3BevnfIVALHVKrrHNQPdYhkQ-IKESTNB5RA,2447
|
|
63
63
|
omdev/cli/install.py,sha256=C-W171YlIHt4Cfok-nWSMbHwWhqF_PFqq2HixFttYx8,4460
|
|
64
|
-
omdev/cli/main.py,sha256=
|
|
64
|
+
omdev/cli/main.py,sha256=oCwKlTiEWIvFT5O1_1R3XxldjFabWI_kEyeRUWJJNiI,3856
|
|
65
65
|
omdev/cli/managers.py,sha256=zqhMgNnv2VbXoTP6SgZeSuWfAVo1Ge-HJnQ1ftL-Mq8,2590
|
|
66
66
|
omdev/cli/types.py,sha256=bqKw9SbtBtAip2vF9v4khh0CqKG6LBr6n9VzWBz7AJE,474
|
|
67
67
|
omdev/interp/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
|
|
@@ -111,7 +111,7 @@ omdev/toml/parser.py,sha256=84bn09uhYHwQGyfww6Rw6y1RxPAE_HDltODOSakcqDM,29186
|
|
|
111
111
|
omdev/toml/writer.py,sha256=lk3on3YXVbWuLJa-xsOzOhs1bBAT1vXqw4mBbluZl_w,3040
|
|
112
112
|
omdev/tools/__init__.py,sha256=iVJAOQ0viGTQOm0DLX4uZLro-9jOioYJGLg9s0kDx1A,78
|
|
113
113
|
omdev/tools/dockertools.py,sha256=x00GV8j1KReMXwxJ641GlcsVwHoWeuzdIKVBp36BqwU,5298
|
|
114
|
-
omdev/tools/gittools.py,sha256=
|
|
114
|
+
omdev/tools/gittools.py,sha256=SMuKeonZP16lYBecmKB7sn_VZ-ljQnJJF6TGX0isVwA,2031
|
|
115
115
|
omdev/tools/importscan.py,sha256=vxOMdAABShqt5-G3n6DGHopCZ5uGgciThY0MCa5W0mA,4066
|
|
116
116
|
omdev/tools/mkrelimp.py,sha256=fwt4GWzenuLNVtzdK2uaJJTSuJbUVJZquF5adwAwlPg,4051
|
|
117
117
|
omdev/tools/nbtools.py,sha256=JZcgTMX3IP-nAtk2QAVU_PXlF4FFNxRDebB8zQX_RQ0,1260
|
|
@@ -119,9 +119,9 @@ omdev/tools/piptools.py,sha256=-jR5q3w4sHqntxCLExFCBNIARB788FUsAbJ62PK2sBU,2774
|
|
|
119
119
|
omdev/tools/proftools.py,sha256=xKSm_yPoCnfsvS3iT9MblDqFMuZmGfI3_koGj8amMyU,145
|
|
120
120
|
omdev/tools/rst.py,sha256=6dWk8QZHoGiLSuBw3TKsXZjjFK6wWBEtPi9krdCLKKg,977
|
|
121
121
|
omdev/tools/sqlrepl.py,sha256=tmFZh80-xsGM62dyQ7_UGLebChrj7IHbIPYBWDJMgVk,5741
|
|
122
|
-
omdev-0.0.0.
|
|
123
|
-
omdev-0.0.0.
|
|
124
|
-
omdev-0.0.0.
|
|
125
|
-
omdev-0.0.0.
|
|
126
|
-
omdev-0.0.0.
|
|
127
|
-
omdev-0.0.0.
|
|
122
|
+
omdev-0.0.0.dev61.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
|
|
123
|
+
omdev-0.0.0.dev61.dist-info/METADATA,sha256=M-ND1diCFqD5wMkvo8x_etYENZI5gtH2UJC2RF8C7iY,1252
|
|
124
|
+
omdev-0.0.0.dev61.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
|
|
125
|
+
omdev-0.0.0.dev61.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
|
|
126
|
+
omdev-0.0.0.dev61.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
|
|
127
|
+
omdev-0.0.0.dev61.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|