omdev 0.0.0.dev112__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/tools/git.py CHANGED
@@ -1,13 +1,17 @@
1
1
  import os
2
2
  import re
3
3
  import subprocess
4
+ import typing as ta
4
5
  import urllib.parse
5
6
 
6
7
  from omlish import argparse as ap
7
8
  from omlish import check
8
9
  from omlish import logs
10
+ from omlish.formats import json
9
11
 
10
12
  from ..cli import CliModule
13
+ from ..git import GitStatusLine
14
+ from ..git import get_git_status
11
15
 
12
16
 
13
17
  def rev_parse(rev: str) -> str:
@@ -124,6 +128,56 @@ class Cli(ap.Cli):
124
128
  else:
125
129
  print(base_rev)
126
130
 
131
+ @ap.command(
132
+ ap.arg('-v', '--verbose', action='store_true'),
133
+ )
134
+ def status(self) -> None:
135
+ st = get_git_status()
136
+
137
+ def gsl_dct(gsl: GitStatusLine) -> ta.Mapping[str, ta.Any]:
138
+ return {
139
+ 'x': gsl.x.name,
140
+ 'y': gsl.y.name,
141
+ 'a': gsl.a,
142
+ **({'b': gsl.b} if gsl.b is not None else {}),
143
+ }
144
+
145
+ def gsl_dct_lst(gsls: ta.Iterable[GitStatusLine]) -> ta.Sequence[ta.Mapping[str, ta.Any]]:
146
+ return [gsl_dct(gsl) for gsl in sorted(gsls, key=lambda gsl: gsl.a)]
147
+
148
+ if self.args.verbose:
149
+ dct = {
150
+ 'by_x': {x.name: gsl_dct_lst(lst) for x, lst in st.by_x.items()},
151
+ 'by_y': {y.name: gsl_dct_lst(lst) for y, lst in st.by_x.items()},
152
+
153
+ 'by_a': {a: gsl_dct(gsl) for a, gsl in sorted(st.by_a.items(), key=lambda t: t[0])},
154
+ 'by_b': {b: gsl_dct(gsl) for b, gsl in sorted(st.by_b.items(), key=lambda t: t[0])},
155
+
156
+ 'has_unmerged': st.has_unmerged,
157
+ 'has_staged': st.has_staged,
158
+ 'has_dirty': st.has_dirty,
159
+ }
160
+
161
+ print(json.dumps_pretty(dct))
162
+
163
+ else:
164
+ print(json.dumps_pretty([gsl_dct(gsl) for gsl in st]))
165
+
166
+ @ap.command(
167
+ ap.arg('-m', '--message', default='--'),
168
+ aliases=['acp'],
169
+ )
170
+ def add_commit_push(self) -> None:
171
+ st = get_git_status()
172
+
173
+ if st.has_dirty:
174
+ subprocess.check_call(['git', 'add', '.'])
175
+
176
+ if st.has_staged or st.has_dirty:
177
+ subprocess.check_call(['git', 'commit', '-m', self.args.message])
178
+
179
+ subprocess.check_call(['git', 'push'])
180
+
127
181
 
128
182
  # @omlish-manifest
129
183
  _CLI_MODULE = CliModule('git', __name__)
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
- pkg_name = check.non_empty_str(self.args.package)
42
- with urllib.request.urlopen(f'{PYPI_URL}rss/project/{pkg_name}/releases.xml') as resp: # noqa
43
- rss = resp.read()
44
- doc = ET.parse(io.BytesIO(rss)) # noqa
45
- latest = check.not_none(doc.find('./channel/item/title')).text
46
- print(latest)
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.dev112
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.dev112
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,12 +1,13 @@
1
- omdev/.manifests.json,sha256=CttiykwDkNVtWsqk7xCLY0o7eUxPVTJvfS5enx6xg5g,7479
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
5
5
  omdev/classdot.py,sha256=YOvgy6x295I_8NKBbBlRVd3AN7Osirm_Lqt4Wj0j9rY,1631
6
6
  omdev/cmake.py,sha256=Diy2ry65806dQP125DAstD3w46z_wszMH7PwC2-6iik,4578
7
7
  omdev/findimports.py,sha256=2t8QP852saEEJFeXySEzhi_nxRSxghlkXz2jVdvy08M,2392
8
- omdev/git.py,sha256=riM2KqSpQPC3N89uipd7Vm3kVgv4EYYDBU9tV1Z8juM,2208
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=oD54mXX-j9UeeCIW2640m8ip5LtAqQvT0hJRbl1zmf8,2874
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
@@ -108,7 +109,7 @@ omdev/ptk/apps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
108
109
  omdev/ptk/apps/ncdu.py,sha256=dOkEJoc2Wjv1u_Uge7Vpei_LvXldoPP5833Eia355tc,4548
109
110
  omdev/pycharm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
110
111
  omdev/pycharm/__main__.py,sha256=hUPp11D024eMdT86BxXiRVtF7AGBk5W6Zn8_mEHSksY,163
111
- omdev/pycharm/cli.py,sha256=XDR3fYUnGdK2oys3IKs7QrGbYwXUiMba16DNXdMVlAA,2209
112
+ omdev/pycharm/cli.py,sha256=WyUlFuG4jAmd7pB5tnZJ54FH1y1orDX3sjB1EWgbmmQ,2343
112
113
  omdev/pyproject/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
113
114
  omdev/pyproject/__main__.py,sha256=gn3Rl1aYPYdiTtEqa9ifi0t-e4ZwPY0vhJ4UXvYdJDY,165
114
115
  omdev/pyproject/cexts.py,sha256=x13piOOnNrYbA17qZLDVuR0p1sqhgEwpk4FtImX-klM,4281
@@ -122,7 +123,7 @@ omdev/scripts/execrss.py,sha256=mR0G0wERBYtQmVIn63lCIIFb5zkCM6X_XOENDFYDBKc,651
122
123
  omdev/scripts/exectime.py,sha256=sFb376GflU6s9gNX-2-we8hgH6w5MuQNS9g6i4SqJIo,610
123
124
  omdev/scripts/importtrace.py,sha256=Jbo3Yk2RAbE8_tJ97iTcVNpoxCJxrRb2tl1W_CV3NG0,14067
124
125
  omdev/scripts/interp.py,sha256=U6mU2RPZjwcBhn4Vl4SrAyDUFcf7bBxBnPY5FHCxosw,72496
125
- omdev/scripts/pyproject.py,sha256=RNWsO9-cu6MUXuWFT1Y200euUu6WcAC4orwGEUoGVWA,165526
126
+ omdev/scripts/pyproject.py,sha256=e2Ncxiju1GinYaXa_PJ3qAyiOApWepS-_uWjcKcJwtw,173682
126
127
  omdev/scripts/slowcat.py,sha256=lssv4yrgJHiWfOiHkUut2p8E8Tq32zB-ujXESQxFFHY,2728
127
128
  omdev/scripts/tmpexec.py,sha256=WTYcf56Tj2qjYV14AWmV8SfT0u6Y8eIU6cKgQRvEK3c,1442
128
129
  omdev/toml/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
@@ -131,20 +132,20 @@ omdev/toml/writer.py,sha256=lk3on3YXVbWuLJa-xsOzOhs1bBAT1vXqw4mBbluZl_w,3040
131
132
  omdev/tools/__init__.py,sha256=iVJAOQ0viGTQOm0DLX4uZLro-9jOioYJGLg9s0kDx1A,78
132
133
  omdev/tools/doc.py,sha256=mv9XfitzqXl3vFHSenv01xHCxWf8g03rUAb_sqoty98,2556
133
134
  omdev/tools/docker.py,sha256=k2BrVvFYwyGov064CPHd_HWo9aqR1zHc2UeEsVwPth4,6827
134
- omdev/tools/git.py,sha256=IARrfL9R9BHpmTBia3svbPeCzf_4qlCCbOsLpohsfUI,4184
135
+ 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=_O7WAACQ1F1ffH4ogZHcppT4P8VQxWQchJMLn9FvsJc,5073
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.dev112.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
146
- omdev-0.0.0.dev112.dist-info/METADATA,sha256=VeCQ5RyISLmbtXUOxqiBvvzJW3kHbcsb8l6KjNrg0C8,1810
147
- omdev-0.0.0.dev112.dist-info/WHEEL,sha256=a7TGlA-5DaHMRrarXjVbQagU3Man_dCnGIWMJr5kRWo,91
148
- omdev-0.0.0.dev112.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
149
- omdev-0.0.0.dev112.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
150
- omdev-0.0.0.dev112.dist-info/RECORD,,
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,,