omdev 0.0.0.dev113__py3-none-any.whl → 0.0.0.dev114__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 +2 -2
- omdev/cli/clicli.py +18 -10
- omdev/pip.py +77 -0
- omdev/tools/pip.py +10 -54
- {omdev-0.0.0.dev113.dist-info → omdev-0.0.0.dev114.dist-info}/METADATA +2 -2
- {omdev-0.0.0.dev113.dist-info → omdev-0.0.0.dev114.dist-info}/RECORD +10 -9
- {omdev-0.0.0.dev113.dist-info → omdev-0.0.0.dev114.dist-info}/LICENSE +0 -0
- {omdev-0.0.0.dev113.dist-info → omdev-0.0.0.dev114.dist-info}/WHEEL +0 -0
- {omdev-0.0.0.dev113.dist-info → omdev-0.0.0.dev114.dist-info}/entry_points.txt +0 -0
- {omdev-0.0.0.dev113.dist-info → omdev-0.0.0.dev114.dist-info}/top_level.txt +0 -0
omdev/.manifests.json
CHANGED
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"module": ".cli.clicli",
|
|
52
52
|
"attr": "_CLI_MODULE",
|
|
53
53
|
"file": "omdev/cli/clicli.py",
|
|
54
|
-
"line":
|
|
54
|
+
"line": 111,
|
|
55
55
|
"value": {
|
|
56
56
|
"$.cli.types.CliModule": {
|
|
57
57
|
"cmd_name": "cli",
|
|
@@ -306,7 +306,7 @@
|
|
|
306
306
|
"module": ".tools.pip",
|
|
307
307
|
"attr": "_CLI_MODULE",
|
|
308
308
|
"file": "omdev/tools/pip.py",
|
|
309
|
-
"line":
|
|
309
|
+
"line": 120,
|
|
310
310
|
"value": {
|
|
311
311
|
"$.cli.types.CliModule": {
|
|
312
312
|
"cmd_name": "pip",
|
omdev/cli/clicli.py
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import inspect
|
|
2
2
|
import os
|
|
3
|
-
import subprocess
|
|
4
3
|
import sys
|
|
5
4
|
import urllib.parse
|
|
6
5
|
import urllib.request
|
|
@@ -8,6 +7,8 @@ import urllib.request
|
|
|
8
7
|
from omlish import __about__
|
|
9
8
|
from omlish import argparse as ap
|
|
10
9
|
|
|
10
|
+
from ..pip import get_root_dists
|
|
11
|
+
from ..pip import lookup_latest_package_version
|
|
11
12
|
from . import install
|
|
12
13
|
from .types import CliModule
|
|
13
14
|
|
|
@@ -50,21 +51,18 @@ class CliCli(ap.Cli):
|
|
|
50
51
|
ap.arg('extra_deps', nargs='*'),
|
|
51
52
|
)
|
|
52
53
|
def reinstall(self) -> None:
|
|
53
|
-
|
|
54
|
-
tool_name = '.'.join([mod_name.partition('.')[0], 'tools', 'pip'])
|
|
54
|
+
latest_version = lookup_latest_package_version(__package__.split('.')[0])
|
|
55
55
|
|
|
56
|
-
|
|
57
|
-
sys.executable,
|
|
58
|
-
'-m',
|
|
59
|
-
tool_name,
|
|
60
|
-
'list-root-dists',
|
|
61
|
-
]).decode()
|
|
56
|
+
#
|
|
62
57
|
|
|
58
|
+
root_dists = get_root_dists()
|
|
63
59
|
deps = sorted(
|
|
64
|
-
(
|
|
60
|
+
(set(root_dists) | set(self.args.extra_deps or []))
|
|
65
61
|
- {install.DEFAULT_CLI_PKG} # noqa
|
|
66
62
|
)
|
|
67
63
|
|
|
64
|
+
#
|
|
65
|
+
|
|
68
66
|
if deps:
|
|
69
67
|
print('Reinstalling with following additional dependencies:')
|
|
70
68
|
print('\n'.join(' ' + d for d in deps))
|
|
@@ -72,12 +70,22 @@ class CliCli(ap.Cli):
|
|
|
72
70
|
print('No additional dependencies detected.')
|
|
73
71
|
print()
|
|
74
72
|
|
|
73
|
+
#
|
|
74
|
+
|
|
75
75
|
if self.args.local:
|
|
76
76
|
print('Reinstalling from local installer.')
|
|
77
77
|
else:
|
|
78
78
|
print(f'Reinstalling from script url: {self.args.url}')
|
|
79
79
|
print()
|
|
80
80
|
|
|
81
|
+
#
|
|
82
|
+
|
|
83
|
+
print(f'Current version: {__about__.__version__}')
|
|
84
|
+
print(f'Latest version: {latest_version}')
|
|
85
|
+
print()
|
|
86
|
+
|
|
87
|
+
#
|
|
88
|
+
|
|
81
89
|
print('Continue with reinstall? (ctrl-c to cancel)')
|
|
82
90
|
input()
|
|
83
91
|
|
omdev/pip.py
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import importlib.metadata
|
|
2
|
+
import io
|
|
3
|
+
import sys
|
|
4
|
+
import typing as ta
|
|
5
|
+
import urllib.request
|
|
6
|
+
|
|
7
|
+
from omlish import check
|
|
8
|
+
from omlish import lang
|
|
9
|
+
|
|
10
|
+
from .packaging.names import canonicalize_name
|
|
11
|
+
from .packaging.requires import RequiresVariable
|
|
12
|
+
from .packaging.requires import parse_requirement
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
if ta.TYPE_CHECKING:
|
|
16
|
+
import xml.etree.ElementTree as ET # noqa
|
|
17
|
+
else:
|
|
18
|
+
ET = lang.proxy_import('xml.etree.ElementTree')
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
##
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
DEFAULT_PYPI_URL = 'https://pypi.org/'
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def lookup_latest_package_version(
|
|
28
|
+
package: str,
|
|
29
|
+
*,
|
|
30
|
+
pypi_url: str = DEFAULT_PYPI_URL,
|
|
31
|
+
) -> str:
|
|
32
|
+
pkg_name = check.non_empty_str(package)
|
|
33
|
+
with urllib.request.urlopen(f'{pypi_url}rss/project/{pkg_name}/releases.xml') as resp: # noqa
|
|
34
|
+
rss = resp.read()
|
|
35
|
+
doc = ET.parse(io.BytesIO(rss)) # noqa
|
|
36
|
+
latest = check.not_none(doc.find('./channel/item/title')).text
|
|
37
|
+
return check.non_empty_str(latest)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
##
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def get_root_dists(
|
|
44
|
+
*,
|
|
45
|
+
paths: ta.Iterable[str] | None = None,
|
|
46
|
+
) -> ta.Sequence[str]:
|
|
47
|
+
# FIXME: track req extras - tuple[str, str] with ('pkg', '') as 'bare'?
|
|
48
|
+
if paths is None:
|
|
49
|
+
paths = sys.path
|
|
50
|
+
|
|
51
|
+
dists: set[str] = set()
|
|
52
|
+
reqs_by_use: dict[str, set[str]] = {}
|
|
53
|
+
uses_by_req: dict[str, set[str]] = {}
|
|
54
|
+
for dist in importlib.metadata.distributions(paths=paths):
|
|
55
|
+
dist_cn = canonicalize_name(dist.metadata['Name'], validate=True)
|
|
56
|
+
if dist_cn in dists:
|
|
57
|
+
# raise NameError(dist_cn)
|
|
58
|
+
# print(f'!! duplicate dist: {dist_cn}', file=sys.stderr)
|
|
59
|
+
continue
|
|
60
|
+
|
|
61
|
+
dists.add(dist_cn)
|
|
62
|
+
for req_str in dist.requires or []:
|
|
63
|
+
req = parse_requirement(req_str)
|
|
64
|
+
|
|
65
|
+
if any(v.value == 'extra' for m in req.marker or [] if isinstance(v := m[0], RequiresVariable)):
|
|
66
|
+
continue
|
|
67
|
+
|
|
68
|
+
req_cn = canonicalize_name(req.name)
|
|
69
|
+
reqs_by_use.setdefault(dist_cn, set()).add(req_cn)
|
|
70
|
+
uses_by_req.setdefault(req_cn, set()).add(dist_cn)
|
|
71
|
+
|
|
72
|
+
roots: list[str] = []
|
|
73
|
+
for d in sorted(dists):
|
|
74
|
+
if not uses_by_req.get(d):
|
|
75
|
+
roots.append(d)
|
|
76
|
+
|
|
77
|
+
return roots
|
omdev/tools/pip.py
CHANGED
|
@@ -3,34 +3,20 @@ TODO:
|
|
|
3
3
|
- https://github.com/pypa/pip/blob/420435903ff2fc694d6950a47b896427ecaed78f/src/pip/_internal/req/req_file.py ?
|
|
4
4
|
"""
|
|
5
5
|
import contextlib
|
|
6
|
-
import importlib.metadata
|
|
7
|
-
import io
|
|
8
6
|
import os.path
|
|
9
7
|
import sys
|
|
10
8
|
import typing as ta
|
|
11
|
-
import urllib.request
|
|
12
9
|
|
|
13
10
|
from omlish import argparse as ap
|
|
14
|
-
from omlish import check
|
|
15
|
-
from omlish import lang
|
|
16
11
|
from omlish import marshal as msh
|
|
17
12
|
from omlish.formats import json
|
|
18
13
|
|
|
19
14
|
from ..cli import CliModule
|
|
20
15
|
from ..packaging import marshal as _ # noqa
|
|
21
|
-
from ..packaging.names import canonicalize_name
|
|
22
16
|
from ..packaging.requires import ParsedRequirement
|
|
23
|
-
from ..packaging.requires import RequiresVariable
|
|
24
17
|
from ..packaging.requires import parse_requirement
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
if ta.TYPE_CHECKING:
|
|
28
|
-
import xml.etree.ElementTree as ET # noqa
|
|
29
|
-
else:
|
|
30
|
-
ET = lang.proxy_import('xml.etree.ElementTree')
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
PYPI_URL = 'https://pypi.org/'
|
|
18
|
+
from ..pip import get_root_dists
|
|
19
|
+
from ..pip import lookup_latest_package_version
|
|
34
20
|
|
|
35
21
|
|
|
36
22
|
class Cli(ap.Cli):
|
|
@@ -38,12 +24,14 @@ class Cli(ap.Cli):
|
|
|
38
24
|
ap.arg('package'),
|
|
39
25
|
)
|
|
40
26
|
def lookup_latest_version(self) -> None:
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
27
|
+
print(lookup_latest_package_version(self.args.package))
|
|
28
|
+
|
|
29
|
+
@ap.command(
|
|
30
|
+
ap.arg('path', nargs='*'),
|
|
31
|
+
)
|
|
32
|
+
def list_root_dists(self) -> None:
|
|
33
|
+
for d in get_root_dists(paths=self.args.path):
|
|
34
|
+
print(d)
|
|
47
35
|
|
|
48
36
|
@ap.command(
|
|
49
37
|
ap.arg('file'),
|
|
@@ -69,38 +57,6 @@ class Cli(ap.Cli):
|
|
|
69
57
|
with open(self.args.file, 'w') as f:
|
|
70
58
|
f.write(new_src)
|
|
71
59
|
|
|
72
|
-
@ap.command(
|
|
73
|
-
ap.arg('path', nargs='*'),
|
|
74
|
-
)
|
|
75
|
-
def list_root_dists(self) -> None:
|
|
76
|
-
# FIXME: track req extras - tuple[str, str] with ('pkg', '') as 'bare'?
|
|
77
|
-
paths = self.args.path or sys.path
|
|
78
|
-
|
|
79
|
-
dists: set[str] = set()
|
|
80
|
-
reqs_by_use: dict[str, set[str]] = {}
|
|
81
|
-
uses_by_req: dict[str, set[str]] = {}
|
|
82
|
-
for dist in importlib.metadata.distributions(paths=paths):
|
|
83
|
-
dist_cn = canonicalize_name(dist.metadata['Name'], validate=True)
|
|
84
|
-
if dist_cn in dists:
|
|
85
|
-
# raise NameError(dist_cn)
|
|
86
|
-
# print(f'!! duplicate dist: {dist_cn}', file=sys.stderr)
|
|
87
|
-
continue
|
|
88
|
-
|
|
89
|
-
dists.add(dist_cn)
|
|
90
|
-
for req_str in dist.requires or []:
|
|
91
|
-
req = parse_requirement(req_str)
|
|
92
|
-
|
|
93
|
-
if any(v.value == 'extra' for m in req.marker or [] if isinstance(v := m[0], RequiresVariable)):
|
|
94
|
-
continue
|
|
95
|
-
|
|
96
|
-
req_cn = canonicalize_name(req.name)
|
|
97
|
-
reqs_by_use.setdefault(dist_cn, set()).add(req_cn)
|
|
98
|
-
uses_by_req.setdefault(req_cn, set()).add(dist_cn)
|
|
99
|
-
|
|
100
|
-
for d in sorted(dists):
|
|
101
|
-
if not uses_by_req.get(d):
|
|
102
|
-
print(d)
|
|
103
|
-
|
|
104
60
|
@ap.command(
|
|
105
61
|
ap.arg('files', nargs='*'),
|
|
106
62
|
ap.arg('-r', '--follow-requirements', action='store_true'),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: omdev
|
|
3
|
-
Version: 0.0.0.
|
|
3
|
+
Version: 0.0.0.dev114
|
|
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.dev114
|
|
16
16
|
Provides-Extra: all
|
|
17
17
|
Requires-Dist: black ~=24.10 ; extra == 'all'
|
|
18
18
|
Requires-Dist: pycparser ~=2.22 ; extra == 'all'
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
omdev/.manifests.json,sha256=
|
|
1
|
+
omdev/.manifests.json,sha256=asjeEXptONz5RkbuMIgHMDGB8QlWRazdWpFEVMznbPM,7479
|
|
2
2
|
omdev/__about__.py,sha256=n5x-SO70OgbDQFzQ1d7sZDVMsnkQc4PxQZPFaIQFa0E,1281
|
|
3
3
|
omdev/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
4
|
omdev/bracepy.py,sha256=I8EdqtDvxzAi3I8TuMEW-RBfwXfqKbwp06CfOdj3L1o,2743
|
|
@@ -7,6 +7,7 @@ omdev/cmake.py,sha256=Diy2ry65806dQP125DAstD3w46z_wszMH7PwC2-6iik,4578
|
|
|
7
7
|
omdev/findimports.py,sha256=2t8QP852saEEJFeXySEzhi_nxRSxghlkXz2jVdvy08M,2392
|
|
8
8
|
omdev/git.py,sha256=B3gnqL75OZqwMvANdZL3cyah6izdM5bZfPJhG134lD0,10520
|
|
9
9
|
omdev/imgur.py,sha256=il12R3t19tALolteYCZywvcdQUEOcgvPyUYgWtKiqt4,2993
|
|
10
|
+
omdev/pip.py,sha256=gRg07NCEjTquOQwnKKgXqfn_YGElO5Pi7hmrAh-AVvQ,2105
|
|
10
11
|
omdev/revisions.py,sha256=U657hf4zeEN32y3g4CzqCAodx_HlfkHj2cIIKALNFDo,5009
|
|
11
12
|
omdev/secrets.py,sha256=bcquaBIDKqX4UIKOzUuKrX7nxVCenj67rRHIMIrd9bk,540
|
|
12
13
|
omdev/tokens.py,sha256=GusxQ1Cd_eiScuR8XTTtc9QFhOgYviYGBZmFnn3Hj7s,756
|
|
@@ -60,7 +61,7 @@ omdev/cexts/_distutils/compilers/unixccompiler.py,sha256=o1h8QuyupLntv4F21_XjzAZ
|
|
|
60
61
|
omdev/cli/__init__.py,sha256=V_l6VP1SZMlJbO-8CJwSuO9TThOy2S_oaPepNYgIrbE,37
|
|
61
62
|
omdev/cli/__main__.py,sha256=mOJpgc07o0r5luQ1DlX4tk2PqZkgmbwPbdzJ3KmtjgQ,138
|
|
62
63
|
omdev/cli/_pathhack.py,sha256=kxqb2kHap68Lkh8b211rDbcgj06hidBiAKA3f9posyc,2119
|
|
63
|
-
omdev/cli/clicli.py,sha256=
|
|
64
|
+
omdev/cli/clicli.py,sha256=OOxlCg7yoV1f8X9MUzl-k26p3PRSqJmGD6TrimYPFv8,2923
|
|
64
65
|
omdev/cli/install.py,sha256=C-W171YlIHt4Cfok-nWSMbHwWhqF_PFqq2HixFttYx8,4460
|
|
65
66
|
omdev/cli/main.py,sha256=nD3bW3MkI0KuDSLpX_PTnl-lBnm4hIxVqczvvMHtupo,7058
|
|
66
67
|
omdev/cli/managers.py,sha256=BV98_n30Jj63OJrFgRoVZRfICxMLXEZKoEn4rMj9LV4,1160
|
|
@@ -135,16 +136,16 @@ omdev/tools/git.py,sha256=sj3I8chXVzcZQyBIP8trq5_96EOXNTmu5YPOWePkR9A,5995
|
|
|
135
136
|
omdev/tools/importscan.py,sha256=QeGjR3UGcuuuDUiisFuAXWHlcKJScGxGEcU6tfOh2CM,4069
|
|
136
137
|
omdev/tools/mkrelimp.py,sha256=wsJAjTIf3nqcSfnT9TkDpS1VUOoM9W2Az5tZdWuzyLM,4054
|
|
137
138
|
omdev/tools/notebook.py,sha256=M8Xi_gfZdlahnyFLtp0RBgYZPSHWQStMMDYZc71Zync,3494
|
|
138
|
-
omdev/tools/pip.py,sha256=
|
|
139
|
+
omdev/tools/pip.py,sha256=cRYKRCjuMI9SR1CBORBbOCePyildLiCIMCECvBDY61E,3471
|
|
139
140
|
omdev/tools/prof.py,sha256=8ZU9x_Dq8eT2ZFwU9sJpDIvxcIn9qBc8y2ELKPb5e5M,1382
|
|
140
141
|
omdev/tools/qr.py,sha256=tm68lPwEAkEwIL2sUKPKBYfwwPtjVWG1DBZwur8_jY8,1737
|
|
141
142
|
omdev/tools/sqlrepl.py,sha256=tmFZh80-xsGM62dyQ7_UGLebChrj7IHbIPYBWDJMgVk,5741
|
|
142
143
|
omdev/tools/pawk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
143
144
|
omdev/tools/pawk/__main__.py,sha256=VCqeRVnqT1RPEoIrqHFSu4PXVMg4YEgF4qCQm90-eRI,66
|
|
144
145
|
omdev/tools/pawk/pawk.py,sha256=Eckymn22GfychCQcQi96BFqRo_LmiJ-EPhC8TTUJdB4,11446
|
|
145
|
-
omdev-0.0.0.
|
|
146
|
-
omdev-0.0.0.
|
|
147
|
-
omdev-0.0.0.
|
|
148
|
-
omdev-0.0.0.
|
|
149
|
-
omdev-0.0.0.
|
|
150
|
-
omdev-0.0.0.
|
|
146
|
+
omdev-0.0.0.dev114.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
|
|
147
|
+
omdev-0.0.0.dev114.dist-info/METADATA,sha256=AuvmLYtU1KklORHYLnpp8MhgEiwN4CPvzsiuxKhdwkQ,1810
|
|
148
|
+
omdev-0.0.0.dev114.dist-info/WHEEL,sha256=a7TGlA-5DaHMRrarXjVbQagU3Man_dCnGIWMJr5kRWo,91
|
|
149
|
+
omdev-0.0.0.dev114.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
|
|
150
|
+
omdev-0.0.0.dev114.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
|
|
151
|
+
omdev-0.0.0.dev114.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|