omdev 0.0.0.dev58__py3-none-any.whl → 0.0.0.dev60__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
@@ -135,7 +135,7 @@
135
135
  "module": ".tools.gittools",
136
136
  "attr": "_CLI_MODULE",
137
137
  "file": "omdev/tools/gittools.py",
138
- "line": 64,
138
+ "line": 74,
139
139
  "value": {
140
140
  "$.cli.types.CliModule": {
141
141
  "cmd_name": "git",
omdev/cli/__main__.py CHANGED
@@ -1,4 +1,6 @@
1
1
  if __name__ == '__main__':
2
+ import sys
3
+
2
4
  from .main import _main # noqa
3
5
 
4
- _main()
6
+ sys.exit(rc if isinstance(rc := _main(), int) else 0)
omdev/cli/main.py CHANGED
@@ -38,30 +38,42 @@ _CLI_FUNCS: ta.Sequence[CliFunc] = [
38
38
  ##
39
39
 
40
40
 
41
- def _main() -> None:
42
- ccs: list[CliCmd] = []
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 = ldr.discover()
54
+ pkgs: list[str] = []
49
55
 
50
- if not pkgs:
51
- pkgs = []
52
- for n in os.listdir(os.getcwd()):
53
- if os.path.isdir(n) and os.path.exists(os.path.join(n, '__init__.py')):
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
- args = parser.parse_args()
79
- if not args.cmd:
80
- mdct: dict = {}
81
- for cc in ccs:
82
- if isinstance(cc.cmd_name, str) and cc.cmd_name[0] == '_':
83
- continue
84
- if isinstance(cc, CliFunc):
85
- mdct.setdefault('-', []).append(cc)
86
- elif isinstance(cc, CliModule):
87
- mdct.setdefault(cc.mod_name.partition('.')[0], []).append(cc)
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
- raise TypeError(cc)
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
- print('Subcommands:\n')
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
- cc = dct[args.cmd]
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
- if isinstance(cc, CliModule):
110
- sys.argv = [args.cmd, *(args.args or ())]
111
- runpy._run_module_as_main(cc.mod_name) # type: ignore # noqa
138
+ match sel:
139
+ case int():
140
+ return sel
112
141
 
113
- elif isinstance(cc, CliFunc):
114
- cc.fn(*(args.args or ()))
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
- else:
117
- raise TypeError(cc)
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/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
- if not (m := self._GITHUB_PAT.fullmatch(self.args.repo)):
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
- self.args.repo,
53
+ f'https://github.com/{user}/{repo}.git',
54
+ os.path.join(user, repo),
46
55
  ])
47
- return
48
56
 
49
- user = m.group('user')
50
- repo = m.group('repo')
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
- os.makedirs(user, 0o755, exist_ok=True)
63
+ subprocess.check_call([
64
+ 'git',
65
+ 'clone',
66
+ *self.unknown_args,
67
+ *self.args.args,
68
+ self.args.repo,
69
+ ])
53
70
 
54
- subprocess.check_call([
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.dev58
3
+ Version: 0.0.0.dev60
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.dev58
15
+ Requires-Dist: omlish ==0.0.0.dev60
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=YBFCesfwODi9Z0xRfCtGjZoJwWpZm5XEsn7g_ieSqy0,4476
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
@@ -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=5IeIERm-371fSI5ZvPv8eldAJBwgKwpR0R49pTsILNM,76
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=sTlrox_s-3zM5zbbZhQ_V_TOy42NiPBR_gLZQiUH4co,2870
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=i2WFM2pX5riDJBchFXMmegOCuLSjvTkKC1ltqShSo7E,1773
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.dev58.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
123
- omdev-0.0.0.dev58.dist-info/METADATA,sha256=C5-bjyXuHh-sHHfbCzkirHEpVPJYnLbw1wVZFS8RfoI,1252
124
- omdev-0.0.0.dev58.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
125
- omdev-0.0.0.dev58.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
126
- omdev-0.0.0.dev58.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
127
- omdev-0.0.0.dev58.dist-info/RECORD,,
122
+ omdev-0.0.0.dev60.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
123
+ omdev-0.0.0.dev60.dist-info/METADATA,sha256=ACU8x10YnMF3nQZwc3Dr4ZeEbK2zPBGsPly45xrxiPA,1252
124
+ omdev-0.0.0.dev60.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
125
+ omdev-0.0.0.dev60.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
126
+ omdev-0.0.0.dev60.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
127
+ omdev-0.0.0.dev60.dist-info/RECORD,,