omdev 0.0.0.dev113__tar.gz → 0.0.0.dev114__tar.gz

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.

Files changed (157) hide show
  1. {omdev-0.0.0.dev113/omdev.egg-info → omdev-0.0.0.dev114}/PKG-INFO +2 -2
  2. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/.manifests.json +2 -2
  3. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cli/clicli.py +18 -10
  4. omdev-0.0.0.dev114/omdev/pip.py +77 -0
  5. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/tools/pip.py +10 -54
  6. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114/omdev.egg-info}/PKG-INFO +2 -2
  7. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev.egg-info/SOURCES.txt +1 -0
  8. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev.egg-info/requires.txt +1 -1
  9. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/pyproject.toml +2 -2
  10. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/LICENSE +0 -0
  11. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/MANIFEST.in +0 -0
  12. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/README.rst +0 -0
  13. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/__about__.py +0 -0
  14. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/__init__.py +0 -0
  15. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/amalg/__init__.py +0 -0
  16. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/amalg/__main__.py +0 -0
  17. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/amalg/amalg.py +0 -0
  18. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/antlr/__init__.py +0 -0
  19. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/antlr/_antlr/__init__.py +0 -0
  20. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/antlr/consts.py +0 -0
  21. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/antlr/gen.py +0 -0
  22. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/bracepy.py +0 -0
  23. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cache/__init__.py +0 -0
  24. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cache/compute/__init__.py +0 -0
  25. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cache/compute/cache.py +0 -0
  26. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cache/compute/contexts.py +0 -0
  27. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cache/compute/currents.py +0 -0
  28. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cache/compute/fns.py +0 -0
  29. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cache/compute/resolvers.py +0 -0
  30. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cache/compute/storage.py +0 -0
  31. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cache/compute/types.py +0 -0
  32. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cache/data/__init__.py +0 -0
  33. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cache/data/actions.py +0 -0
  34. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cache/data/cache.py +0 -0
  35. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cache/data/consts.py +0 -0
  36. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cache/data/defaults.py +0 -0
  37. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cache/data/manifests.py +0 -0
  38. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cache/data/specs.py +0 -0
  39. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cexts/__init__.py +0 -0
  40. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cexts/_boilerplate.cc +0 -0
  41. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cexts/_distutils/LICENSE +0 -0
  42. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cexts/_distutils/__init__.py +0 -0
  43. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cexts/_distutils/build_ext.py +0 -0
  44. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  45. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  46. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cexts/_distutils/compilers/options.py +0 -0
  47. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  48. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cexts/_distutils/dir_util.py +0 -0
  49. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cexts/_distutils/errors.py +0 -0
  50. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cexts/_distutils/extension.py +0 -0
  51. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cexts/_distutils/file_util.py +0 -0
  52. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cexts/_distutils/modified.py +0 -0
  53. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cexts/_distutils/spawn.py +0 -0
  54. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cexts/_distutils/sysconfig.py +0 -0
  55. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cexts/_distutils/util.py +0 -0
  56. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cexts/_distutils/version.py +0 -0
  57. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cexts/build.py +0 -0
  58. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cexts/cmake.py +0 -0
  59. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cexts/importhook.py +0 -0
  60. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cexts/magic.py +0 -0
  61. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cexts/scan.py +0 -0
  62. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/classdot.py +0 -0
  63. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cli/__init__.py +0 -0
  64. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cli/__main__.py +0 -0
  65. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cli/_pathhack.py +0 -0
  66. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cli/install.py +0 -0
  67. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cli/main.py +0 -0
  68. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cli/managers.py +0 -0
  69. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cli/types.py +0 -0
  70. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/clipboard/__init__.py +0 -0
  71. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/clipboard/clipboard.py +0 -0
  72. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/clipboard/darwin.py +0 -0
  73. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/cmake.py +0 -0
  74. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/findimports.py +0 -0
  75. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/git.py +0 -0
  76. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/imgur.py +0 -0
  77. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/interp/__init__.py +0 -0
  78. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/interp/__main__.py +0 -0
  79. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/interp/cli.py +0 -0
  80. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/interp/inspect.py +0 -0
  81. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/interp/providers.py +0 -0
  82. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/interp/pyenv.py +0 -0
  83. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/interp/resolvers.py +0 -0
  84. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/interp/standalone.py +0 -0
  85. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/interp/system.py +0 -0
  86. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/interp/types.py +0 -0
  87. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/magic/__init__.py +0 -0
  88. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/magic/find.py +0 -0
  89. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/magic/magic.py +0 -0
  90. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/magic/prepare.py +0 -0
  91. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/magic/styles.py +0 -0
  92. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/manifests/__init__.py +0 -0
  93. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/manifests/build.py +0 -0
  94. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/manifests/load.py +0 -0
  95. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/manifests/types.py +0 -0
  96. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/mypy/__init__.py +0 -0
  97. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/mypy/debug.py +0 -0
  98. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/packaging/__init__.py +0 -0
  99. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/packaging/marshal.py +0 -0
  100. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/packaging/names.py +0 -0
  101. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/packaging/requires.py +0 -0
  102. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/packaging/specifiers.py +0 -0
  103. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/packaging/versions.py +0 -0
  104. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/precheck/__init__.py +0 -0
  105. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/precheck/__main__.py +0 -0
  106. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/precheck/base.py +0 -0
  107. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/precheck/git.py +0 -0
  108. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/precheck/lite.py +0 -0
  109. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/precheck/main.py +0 -0
  110. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/precheck/manifests.py +0 -0
  111. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/precheck/scripts.py +0 -0
  112. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/ptk/__init__.py +0 -0
  113. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/ptk/apps/__init__.py +0 -0
  114. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/ptk/apps/ncdu.py +0 -0
  115. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/pycharm/__init__.py +0 -0
  116. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/pycharm/__main__.py +0 -0
  117. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/pycharm/cli.py +0 -0
  118. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/pyproject/__init__.py +0 -0
  119. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/pyproject/__main__.py +0 -0
  120. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/pyproject/cexts.py +0 -0
  121. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/pyproject/cli.py +0 -0
  122. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/pyproject/configs.py +0 -0
  123. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/pyproject/pkg.py +0 -0
  124. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/pyproject/reqs.py +0 -0
  125. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/revisions.py +0 -0
  126. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/scripts/__init__.py +0 -0
  127. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/scripts/bumpversion.py +0 -0
  128. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/scripts/execrss.py +0 -0
  129. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/scripts/exectime.py +0 -0
  130. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/scripts/importtrace.py +0 -0
  131. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/scripts/interp.py +0 -0
  132. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/scripts/pyproject.py +0 -0
  133. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/scripts/slowcat.py +0 -0
  134. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/scripts/tmpexec.py +0 -0
  135. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/secrets.py +0 -0
  136. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/tokens.py +0 -0
  137. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/toml/__init__.py +0 -0
  138. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/toml/parser.py +0 -0
  139. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/toml/writer.py +0 -0
  140. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/tools/__init__.py +0 -0
  141. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/tools/doc.py +0 -0
  142. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/tools/docker.py +0 -0
  143. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/tools/git.py +0 -0
  144. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/tools/importscan.py +0 -0
  145. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/tools/mkrelimp.py +0 -0
  146. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/tools/notebook.py +0 -0
  147. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/tools/pawk/__init__.py +0 -0
  148. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/tools/pawk/__main__.py +0 -0
  149. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/tools/pawk/pawk.py +0 -0
  150. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/tools/prof.py +0 -0
  151. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/tools/qr.py +0 -0
  152. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/tools/sqlrepl.py +0 -0
  153. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev/wheelfile.py +0 -0
  154. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev.egg-info/dependency_links.txt +0 -0
  155. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev.egg-info/entry_points.txt +0 -0
  156. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/omdev.egg-info/top_level.txt +0 -0
  157. {omdev-0.0.0.dev113 → omdev-0.0.0.dev114}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omdev
3
- Version: 0.0.0.dev113
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.dev113
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"
@@ -51,7 +51,7 @@
51
51
  "module": ".cli.clicli",
52
52
  "attr": "_CLI_MODULE",
53
53
  "file": "omdev/cli/clicli.py",
54
- "line": 103,
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": 164,
309
+ "line": 120,
310
310
  "value": {
311
311
  "$.cli.types.CliModule": {
312
312
  "cmd_name": "pip",
@@ -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
- mod_name = globals()['__spec__'].name
54
- tool_name = '.'.join([mod_name.partition('.')[0], 'tools', 'pip'])
54
+ latest_version = lookup_latest_package_version(__package__.split('.')[0])
55
55
 
56
- out = subprocess.check_output([
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
- ({s for l in out.splitlines() if (s := l.strip())} | set(self.args.extra_deps or []))
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
 
@@ -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
@@ -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.dev113
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.dev113
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"
@@ -11,6 +11,7 @@ omdev/cmake.py
11
11
  omdev/findimports.py
12
12
  omdev/git.py
13
13
  omdev/imgur.py
14
+ omdev/pip.py
14
15
  omdev/revisions.py
15
16
  omdev/secrets.py
16
17
  omdev/tokens.py
@@ -1,4 +1,4 @@
1
- omlish==0.0.0.dev113
1
+ omlish==0.0.0.dev114
2
2
 
3
3
  [all]
4
4
  black~=24.10
@@ -12,7 +12,7 @@ authors = [
12
12
  urls = {source = 'https://github.com/wrmsr/omlish'}
13
13
  license = {text = 'BSD-3-Clause'}
14
14
  requires-python = '>=3.12'
15
- version = '0.0.0.dev113'
15
+ version = '0.0.0.dev114'
16
16
  classifiers = [
17
17
  'License :: OSI Approved :: BSD License',
18
18
  'Development Status :: 2 - Pre-Alpha',
@@ -22,7 +22,7 @@ classifiers = [
22
22
  ]
23
23
  description = 'omdev'
24
24
  dependencies = [
25
- 'omlish == 0.0.0.dev113',
25
+ 'omlish == 0.0.0.dev114',
26
26
  ]
27
27
 
28
28
  [project.optional-dependencies]
File without changes
File without changes
File without changes
File without changes
File without changes