omdev 0.0.0.dev30__tar.gz → 0.0.0.dev32__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 (123) hide show
  1. {omdev-0.0.0.dev30/omdev.egg-info → omdev-0.0.0.dev32}/PKG-INFO +2 -2
  2. omdev-0.0.0.dev32/omdev/.manifests.json +122 -0
  3. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/__about__.py +9 -0
  4. omdev-0.0.0.dev32/omdev/amalg/__main__.py +11 -0
  5. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/amalg/amalg.py +4 -4
  6. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cexts/_boilerplate.cc +1 -1
  7. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cexts/cmake.py +5 -0
  8. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cexts/magic.py +1 -1
  9. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/classdot.py +6 -0
  10. omdev-0.0.0.dev32/omdev/cli/__init__.py +1 -0
  11. {omdev-0.0.0.dev30/omdev/pyproject → omdev-0.0.0.dev32/omdev/cli}/__main__.py +1 -1
  12. omdev-0.0.0.dev32/omdev/cli/main.py +59 -0
  13. omdev-0.0.0.dev32/omdev/cli/types.py +7 -0
  14. omdev-0.0.0.dev32/omdev/interp/__main__.py +11 -0
  15. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/interp/cli.py +13 -5
  16. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/interp/pyenv.py +53 -4
  17. omdev-0.0.0.dev32/omdev/manifests/__init__.py +2 -0
  18. omdev-0.0.0.dev30/omdev/manifests.py → omdev-0.0.0.dev32/omdev/manifests/build.py +97 -34
  19. omdev-0.0.0.dev32/omdev/manifests/load.py +149 -0
  20. omdev-0.0.0.dev32/omdev/manifests/types.py +16 -0
  21. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/precheck/precheck.py +6 -0
  22. omdev-0.0.0.dev32/omdev/pyproject/__main__.py +11 -0
  23. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/pyproject/cli.py +2 -2
  24. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/pyproject/pkg.py +13 -2
  25. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/pyproject/reqs.py +1 -1
  26. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/scripts/interp.py +64 -9
  27. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/scripts/pyproject.py +77 -11
  28. omdev-0.0.0.dev32/omdev/secrets.py +12 -0
  29. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/toml/writer.py +8 -1
  30. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/tools/dockertools.py +6 -0
  31. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/tools/gittools.py +6 -0
  32. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/tools/piptools.py +6 -0
  33. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/tools/sqlrepl.py +6 -0
  34. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32/omdev.egg-info}/PKG-INFO +2 -2
  35. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev.egg-info/SOURCES.txt +10 -1
  36. omdev-0.0.0.dev32/omdev.egg-info/entry_points.txt +2 -0
  37. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev.egg-info/requires.txt +1 -1
  38. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/pyproject.toml +5 -2
  39. omdev-0.0.0.dev30/omdev/.manifests.json +0 -1
  40. omdev-0.0.0.dev30/omdev/amalg/__main__.py +0 -4
  41. omdev-0.0.0.dev30/omdev/interp/__main__.py +0 -4
  42. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/LICENSE +0 -0
  43. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/MANIFEST.in +0 -0
  44. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/README.rst +0 -0
  45. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/__init__.py +0 -0
  46. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/amalg/__init__.py +0 -0
  47. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/bracepy.py +0 -0
  48. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cache/__init__.py +0 -0
  49. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cache/compute/__init__.py +0 -0
  50. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cache/compute/cache.py +0 -0
  51. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cache/compute/contexts.py +0 -0
  52. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cache/compute/currents.py +0 -0
  53. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cache/compute/fns.py +0 -0
  54. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cache/compute/resolvers.py +0 -0
  55. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cache/compute/storage.py +0 -0
  56. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cache/compute/types.py +0 -0
  57. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cache/data/__init__.py +0 -0
  58. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cache/data/actions.py +0 -0
  59. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cache/data/cache.py +0 -0
  60. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cache/data/consts.py +0 -0
  61. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cache/data/defaults.py +0 -0
  62. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cache/data/manifests.py +0 -0
  63. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cache/data/specs.py +0 -0
  64. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cexts/__init__.py +0 -0
  65. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/LICENSE +0 -0
  66. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/__init__.py +0 -0
  67. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/build_ext.py +0 -0
  68. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  69. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  70. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/compilers/options.py +0 -0
  71. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  72. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/dir_util.py +0 -0
  73. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/errors.py +0 -0
  74. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/extension.py +0 -0
  75. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/file_util.py +0 -0
  76. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/modified.py +0 -0
  77. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/spawn.py +0 -0
  78. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/sysconfig.py +0 -0
  79. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/util.py +0 -0
  80. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/version.py +0 -0
  81. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cexts/build.py +0 -0
  82. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cexts/importhook.py +0 -0
  83. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cexts/scan.py +0 -0
  84. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/cmake.py +0 -0
  85. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/findimports.py +0 -0
  86. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/findmagic.py +0 -0
  87. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/git.py +0 -0
  88. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/interp/__init__.py +0 -0
  89. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/interp/inspect.py +0 -0
  90. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/interp/providers.py +0 -0
  91. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/interp/resolvers.py +0 -0
  92. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/interp/standalone.py +0 -0
  93. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/interp/system.py +0 -0
  94. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/interp/types.py +0 -0
  95. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/mypy/__init__.py +0 -0
  96. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/mypy/debug.py +0 -0
  97. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/precheck/__init__.py +0 -0
  98. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/precheck/__main__.py +0 -0
  99. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/precheck/base.py +0 -0
  100. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/precheck/git.py +0 -0
  101. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/precheck/lite.py +0 -0
  102. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/precheck/scripts.py +0 -0
  103. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/pyproject/__init__.py +0 -0
  104. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/pyproject/cexts.py +0 -0
  105. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/pyproject/configs.py +0 -0
  106. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/revisions.py +0 -0
  107. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/scripts/__init__.py +0 -0
  108. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/scripts/bumpversion.py +0 -0
  109. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/scripts/execrss.py +0 -0
  110. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/tokens.py +0 -0
  111. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/toml/__init__.py +0 -0
  112. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/toml/parser.py +0 -0
  113. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/tools/__init__.py +0 -0
  114. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/tools/importscan.py +0 -0
  115. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/tools/importtrace.py +0 -0
  116. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/tools/rst.py +0 -0
  117. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/versioning/__init__.py +0 -0
  118. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/versioning/specifiers.py +0 -0
  119. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/versioning/versions.py +0 -0
  120. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev/wheelfile.py +0 -0
  121. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev.egg-info/dependency_links.txt +0 -0
  122. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/omdev.egg-info/top_level.txt +0 -0
  123. {omdev-0.0.0.dev30 → omdev-0.0.0.dev32}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omdev
3
- Version: 0.0.0.dev30
3
+ Version: 0.0.0.dev32
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.dev30
15
+ Requires-Dist: omlish==0.0.0.dev32
16
16
  Provides-Extra: all
17
17
  Requires-Dist: pycparser~=2.22; extra == "all"
18
18
  Requires-Dist: cffi~=1.17; extra == "all"
@@ -0,0 +1,122 @@
1
+ [
2
+ {
3
+ "module": ".classdot",
4
+ "attr": "_CLI_MODULE",
5
+ "file": "omdev/classdot.py",
6
+ "line": 62,
7
+ "value": {
8
+ "$.cli.types.CliModule": {
9
+ "cmd_name": "classdot",
10
+ "mod_name": "omdev.classdot"
11
+ }
12
+ }
13
+ },
14
+ {
15
+ "module": ".tools.piptools",
16
+ "attr": "_CLI_MODULE",
17
+ "file": "omdev/tools/piptools.py",
18
+ "line": 51,
19
+ "value": {
20
+ "$.cli.types.CliModule": {
21
+ "cmd_name": "pip",
22
+ "mod_name": "omdev.tools.piptools"
23
+ }
24
+ }
25
+ },
26
+ {
27
+ "module": ".tools.gittools",
28
+ "attr": "_CLI_MODULE",
29
+ "file": "omdev/tools/gittools.py",
30
+ "line": 22,
31
+ "value": {
32
+ "$.cli.types.CliModule": {
33
+ "cmd_name": "git",
34
+ "mod_name": "omdev.tools.gittools"
35
+ }
36
+ }
37
+ },
38
+ {
39
+ "module": ".tools.dockertools",
40
+ "attr": "_CLI_MODULE",
41
+ "file": "omdev/tools/dockertools.py",
42
+ "line": 183,
43
+ "value": {
44
+ "$.cli.types.CliModule": {
45
+ "cmd_name": "docker",
46
+ "mod_name": "omdev.tools.dockertools"
47
+ }
48
+ }
49
+ },
50
+ {
51
+ "module": ".tools.sqlrepl",
52
+ "attr": "_CLI_MODULE",
53
+ "file": "omdev/tools/sqlrepl.py",
54
+ "line": 193,
55
+ "value": {
56
+ "$.cli.types.CliModule": {
57
+ "cmd_name": "sqlrepl",
58
+ "mod_name": "omdev.tools.sqlrepl"
59
+ }
60
+ }
61
+ },
62
+ {
63
+ "module": ".interp.__main__",
64
+ "attr": "_CLI_MODULE",
65
+ "file": "omdev/interp/__main__.py",
66
+ "line": 4,
67
+ "value": {
68
+ "$.cli.types.CliModule": {
69
+ "cmd_name": "interp",
70
+ "mod_name": "omdev.interp.__main__"
71
+ }
72
+ }
73
+ },
74
+ {
75
+ "module": ".pyproject.__main__",
76
+ "attr": "_CLI_MODULE",
77
+ "file": "omdev/pyproject/__main__.py",
78
+ "line": 4,
79
+ "value": {
80
+ "$.cli.types.CliModule": {
81
+ "cmd_name": "pyproject",
82
+ "mod_name": "omdev.pyproject.__main__"
83
+ }
84
+ }
85
+ },
86
+ {
87
+ "module": ".cexts.cmake",
88
+ "attr": "_CLI_MODULE",
89
+ "file": "omdev/cexts/cmake.py",
90
+ "line": 323,
91
+ "value": {
92
+ "$.cli.types.CliModule": {
93
+ "cmd_name": "cmake",
94
+ "mod_name": "omdev.cexts.cmake"
95
+ }
96
+ }
97
+ },
98
+ {
99
+ "module": ".precheck.precheck",
100
+ "attr": "_CLI_MODULE",
101
+ "file": "omdev/precheck/precheck.py",
102
+ "line": 90,
103
+ "value": {
104
+ "$.cli.types.CliModule": {
105
+ "cmd_name": "precheck",
106
+ "mod_name": "omdev.precheck.precheck"
107
+ }
108
+ }
109
+ },
110
+ {
111
+ "module": ".amalg.__main__",
112
+ "attr": "_CLI_MODULE",
113
+ "file": "omdev/amalg/__main__.py",
114
+ "line": 4,
115
+ "value": {
116
+ "$.cli.types.CliModule": {
117
+ "cmd_name": "amalg",
118
+ "mod_name": "omdev.amalg.__main__"
119
+ }
120
+ }
121
+ }
122
+ ]
@@ -35,6 +35,15 @@ class Project(ProjectBase):
35
35
  ],
36
36
  }
37
37
 
38
+ entry_points = {
39
+ 'omlish.manifests': {name: name},
40
+ }
41
+
42
+ # FIXME: omdev-cli ?
43
+ # scripts = {
44
+ # 'om': f'{name}.cli.main:_main [cli]',
45
+ # }
46
+
38
47
 
39
48
  class Setuptools(SetuptoolsBase):
40
49
  cexts = True
@@ -0,0 +1,11 @@
1
+ from ..cli import CliModule
2
+
3
+
4
+ # @omlish-manifest
5
+ _CLI_MODULE = CliModule('amalg', __name__)
6
+
7
+
8
+ if __name__ == '__main__':
9
+ from .amalg import _main
10
+
11
+ _main()
@@ -4,9 +4,9 @@ Conventions:
4
4
  - must import 'from' items for local modules
5
5
 
6
6
  TODO:
7
- - check 3.8 compat
7
+ - !! strip manifests? or relegate them to a separate tiny module ala __main__.py?
8
+ - # @omlish-no-amalg ? in cli.types? will strip stmt (more than 1 line) following @manifest, so shouldn't import
8
9
  - more sanity checks lol
9
- - flake8 / ruff mgmt
10
10
  - typealias - support # noqa, other comments, and lamely support multiline by just stealing lines till it parses
11
11
  - remove `if __name__ == '__main__':` blocks - thus, convention: no def _main() for these
12
12
 
@@ -339,8 +339,8 @@ RUFF_DISABLES: ta.AbstractSet[str] = {
339
339
  'UP036', # outdated-version-block
340
340
  }
341
341
 
342
- OUTPUT_COMMENT = '# @omdev-amalg-output '
343
- SCAN_COMMENT = '# @omdev-amalg '
342
+ OUTPUT_COMMENT = '# @omlish-amalg-output '
343
+ SCAN_COMMENT = '# @omlish-amalg '
344
344
 
345
345
 
346
346
  def gen_amalg(
@@ -1,4 +1,4 @@
1
- // @omdev-cext
1
+ // @omlish-cext
2
2
  #define PY_SSIZE_T_CLEAN
3
3
  #include "Python.h"
4
4
  #include "structmember.h"
@@ -38,6 +38,7 @@ from omlish import logs
38
38
 
39
39
  from .. import cmake
40
40
  from .. import findmagic
41
+ from ..cli import CliModule
41
42
  from .magic import CextMagic
42
43
 
43
44
 
@@ -319,6 +320,10 @@ def _gen_cmd(args) -> None:
319
320
  cpg.run()
320
321
 
321
322
 
323
+ # @omlish-manifest
324
+ _CLI_MODULE = CliModule('cmake', __name__)
325
+
326
+
322
327
  def _main(argv=None) -> None:
323
328
  logs.configure_standard_logging('INFO')
324
329
 
@@ -1,7 +1,7 @@
1
1
  # @omlish-lite
2
2
 
3
3
  class CextMagic:
4
- MAGIC = '@omdev-cext'
4
+ MAGIC = '@omlish-cext'
5
5
  MAGIC_COMMENT = f'// {MAGIC}'
6
6
 
7
7
  FILE_EXTENSIONS = ('c', 'cc', 'cpp')
@@ -7,6 +7,8 @@ import typing as ta
7
7
 
8
8
  from omlish.graphs import dot
9
9
 
10
+ from .cli import CliModule
11
+
10
12
 
11
13
  def gen_class_dot(roots: ta.Iterable[type]) -> dot.Graph:
12
14
  roots = set(roots)
@@ -57,5 +59,9 @@ def _main() -> None:
57
59
  dot.open_dot(dot.render(scd), sleep_s=1.)
58
60
 
59
61
 
62
+ # @omlish-manifest
63
+ _CLI_MODULE = CliModule('classdot', __name__)
64
+
65
+
60
66
  if __name__ == '__main__':
61
67
  _main()
@@ -0,0 +1 @@
1
+ from .types import CliModule # noqa
@@ -1,4 +1,4 @@
1
1
  if __name__ == '__main__':
2
- from .cli import _main
2
+ from .main import _main
3
3
 
4
4
  _main()
@@ -0,0 +1,59 @@
1
+ """
2
+ TODO:
3
+ - allow manually specifying manifest packages
4
+ - omlish.bootstrap always
5
+ - https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#creating-executable-scripts
6
+ - https://packaging.python.org/en/latest/specifications/entry-points/#entry-points
7
+ """
8
+ import argparse
9
+ import functools
10
+ import os
11
+ import runpy
12
+ import sys
13
+
14
+ from omlish import check
15
+
16
+ from ..manifests.load import ManifestLoader
17
+ from .types import CliModule
18
+
19
+
20
+ def _main() -> None:
21
+ cms: list[CliModule] = []
22
+
23
+ ldr = ManifestLoader.from_entry_point(globals())
24
+
25
+ pkgs = ldr.discover()
26
+ if not pkgs:
27
+ pkgs = []
28
+ for n in os.listdir(os.getcwd()):
29
+ if os.path.isdir(n) and os.path.exists(os.path.join(n, '__init__.py')):
30
+ pkgs.append(n)
31
+
32
+ for m in ldr.load(*pkgs, only=[CliModule]):
33
+ cms.append(check.isinstance(m.value, CliModule))
34
+
35
+ parser = argparse.ArgumentParser()
36
+ subparsers = parser.add_subparsers()
37
+
38
+ def run(cm: CliModule) -> None:
39
+ sys.argv = [cm.cmd_name, *(args.args or ())]
40
+ runpy._run_module_as_main(cm.mod_name) # type: ignore # noqa
41
+
42
+ seen: set[str] = set()
43
+ for cm in cms:
44
+ if cm.cmd_name in seen:
45
+ raise NameError(cm)
46
+
47
+ cmd_parser = subparsers.add_parser(cm.cmd_name)
48
+ cmd_parser.add_argument('args', nargs=argparse.REMAINDER)
49
+ cmd_parser.set_defaults(func=functools.partial(run, cm))
50
+
51
+ args = parser.parse_args()
52
+ if not getattr(args, 'func', None):
53
+ parser.print_help()
54
+ else:
55
+ args.func()
56
+
57
+
58
+ if __name__ == '__main__':
59
+ _main()
@@ -0,0 +1,7 @@
1
+ import dataclasses as dc
2
+
3
+
4
+ @dc.dataclass(frozen=True)
5
+ class CliModule:
6
+ cmd_name: str
7
+ mod_name: str
@@ -0,0 +1,11 @@
1
+ from ..cli import CliModule
2
+
3
+
4
+ # @omlish-manifest
5
+ _CLI_MODULE = CliModule('interp', __name__)
6
+
7
+
8
+ if __name__ == '__main__':
9
+ from .cli import _main
10
+
11
+ _main()
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env python3
2
- # @omdev-amalg ../scripts/interp.py
2
+ # @omlish-amalg ../scripts/interp.py
3
3
  # ruff: noqa: UP007
4
4
  """
5
5
  TODO:
@@ -15,6 +15,8 @@ from omlish.lite.logs import configure_standard_logging
15
15
  from omlish.lite.runtime import check_runtime_version
16
16
 
17
17
  from .resolvers import DEFAULT_INTERP_RESOLVER
18
+ from .resolvers import INTERP_PROVIDER_TYPES_BY_NAME
19
+ from .resolvers import InterpResolver
18
20
  from .types import InterpSpecifier
19
21
 
20
22
 
@@ -25,9 +27,13 @@ def _list_cmd(args) -> None:
25
27
 
26
28
 
27
29
  def _resolve_cmd(args) -> None:
28
- r = DEFAULT_INTERP_RESOLVER
30
+ if args.provider:
31
+ p = INTERP_PROVIDER_TYPES_BY_NAME[args.provider]()
32
+ r = InterpResolver([(p.name, p)])
33
+ else:
34
+ r = DEFAULT_INTERP_RESOLVER
29
35
  s = InterpSpecifier.parse(args.version)
30
- print(check_not_none(r.resolve(s)).exe)
36
+ print(check_not_none(r.resolve(s, install=bool(args.install))).exe)
31
37
 
32
38
 
33
39
  def _build_parser() -> argparse.ArgumentParser:
@@ -37,12 +43,14 @@ def _build_parser() -> argparse.ArgumentParser:
37
43
 
38
44
  parser_list = subparsers.add_parser('list')
39
45
  parser_list.add_argument('version')
40
- parser_list.add_argument('--debug', action='store_true')
46
+ parser_list.add_argument('-d', '--debug', action='store_true')
41
47
  parser_list.set_defaults(func=_list_cmd)
42
48
 
43
49
  parser_resolve = subparsers.add_parser('resolve')
44
50
  parser_resolve.add_argument('version')
45
- parser_resolve.add_argument('--debug', action='store_true')
51
+ parser_resolve.add_argument('-p', '--provider')
52
+ parser_resolve.add_argument('-d', '--debug', action='store_true')
53
+ parser_resolve.add_argument('-i', '--install', action='store_true')
46
54
  parser_resolve.set_defaults(func=_resolve_cmd)
47
55
 
48
56
  return parser
@@ -1,6 +1,11 @@
1
1
  """
2
2
  TODO:
3
3
  - custom tags
4
+ - 'aliases'
5
+ - https://github.com/pyenv/pyenv/pull/2966
6
+ - https://github.com/pyenv/pyenv/issues/218 (lol)
7
+ - probably need custom (temp?) definition file
8
+ - *or* python-build directly just into the versions dir?
4
9
  - optionally install / upgrade pyenv itself
5
10
  - new vers dont need these custom mac opts, only run on old vers
6
11
  """
@@ -122,8 +127,33 @@ class PyenvInstallOpts:
122
127
  )
123
128
 
124
129
 
125
- DEFAULT_PYENV_INSTALL_OPTS = PyenvInstallOpts(opts=['-s', '-v'])
130
+ # TODO: https://github.com/pyenv/pyenv/blob/master/plugins/python-build/README.md#building-for-maximum-performance
131
+ DEFAULT_PYENV_INSTALL_OPTS = PyenvInstallOpts(
132
+ opts=[
133
+ '-s',
134
+ '-v',
135
+ '-k',
136
+ ],
137
+ conf_opts=[
138
+ '--enable-loadable-sqlite-extensions',
139
+
140
+ # '--enable-shared',
141
+
142
+ '--enable-optimizations',
143
+ '--with-lto',
144
+
145
+ # '--enable-profiling', # ?
146
+
147
+ # '--enable-ipv6', # ?
148
+ ],
149
+ cflags=[
150
+ # '-march=native',
151
+ # '-mtune=native',
152
+ ],
153
+ )
154
+
126
155
  DEBUG_PYENV_INSTALL_OPTS = PyenvInstallOpts(opts=['-g'])
156
+
127
157
  THREADED_PYENV_INSTALL_OPTS = PyenvInstallOpts(conf_opts=['--disable-gil'])
128
158
 
129
159
 
@@ -222,6 +252,7 @@ class PyenvVersionInstaller:
222
252
  opts: ta.Optional[PyenvInstallOpts] = None,
223
253
  interp_opts: InterpOpts = InterpOpts(),
224
254
  *,
255
+ install_name: ta.Optional[str] = None,
225
256
  no_default_opts: bool = False,
226
257
  pyenv: Pyenv = Pyenv(),
227
258
  ) -> None:
@@ -242,6 +273,7 @@ class PyenvVersionInstaller:
242
273
  self._version = version
243
274
  self._opts = opts
244
275
  self._interp_opts = interp_opts
276
+ self._given_install_name = install_name
245
277
 
246
278
  self._no_default_opts = no_default_opts
247
279
  self._pyenv = pyenv
@@ -256,6 +288,8 @@ class PyenvVersionInstaller:
256
288
 
257
289
  @cached_nullary
258
290
  def install_name(self) -> str:
291
+ if self._given_install_name is not None:
292
+ return self._given_install_name
259
293
  return self._version + ('-debug' if self._interp_opts.debug else '')
260
294
 
261
295
  @cached_nullary
@@ -275,11 +309,26 @@ class PyenvVersionInstaller:
275
309
  v += ' ' + os.environ[k]
276
310
  env[k] = v
277
311
 
278
- subprocess_check_call(
279
- self._pyenv.exe(),
280
- 'install',
312
+ conf_args = [
281
313
  *self._opts.opts,
282
314
  self._version,
315
+ ]
316
+
317
+ if self._given_install_name is not None:
318
+ full_args = [
319
+ os.path.join(check_not_none(self._pyenv.root()), 'plugins', 'python-build', 'bin', 'python-build'),
320
+ *conf_args,
321
+ self.install_dir(),
322
+ ]
323
+ else:
324
+ full_args = [
325
+ self._pyenv.exe(),
326
+ 'install',
327
+ *conf_args,
328
+ ]
329
+
330
+ subprocess_check_call(
331
+ *full_args,
283
332
  env=env,
284
333
  )
285
334
 
@@ -0,0 +1,2 @@
1
+ # @omlish-lite
2
+ from .types import Manifest # noqa