omdev 0.0.0.dev31__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.dev31/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.dev31 → 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.dev31 → omdev-0.0.0.dev32}/omdev/amalg/amalg.py +4 -4
  6. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cexts/_boilerplate.cc +1 -1
  7. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cexts/cmake.py +5 -0
  8. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cexts/magic.py +1 -1
  9. {omdev-0.0.0.dev31 → 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.dev31/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.dev31 → omdev-0.0.0.dev32}/omdev/interp/cli.py +13 -5
  16. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/interp/pyenv.py +54 -12
  17. omdev-0.0.0.dev32/omdev/manifests/__init__.py +2 -0
  18. omdev-0.0.0.dev31/omdev/manifests.py → omdev-0.0.0.dev32/omdev/manifests/build.py +27 -58
  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.dev31 → 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.dev31 → omdev-0.0.0.dev32}/omdev/pyproject/cli.py +1 -1
  24. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/pyproject/pkg.py +13 -2
  25. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/pyproject/reqs.py +1 -1
  26. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/scripts/interp.py +65 -17
  27. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/scripts/pyproject.py +77 -18
  28. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/toml/writer.py +8 -1
  29. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/tools/dockertools.py +6 -0
  30. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/tools/gittools.py +6 -0
  31. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/tools/piptools.py +6 -0
  32. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/tools/sqlrepl.py +6 -0
  33. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32/omdev.egg-info}/PKG-INFO +2 -2
  34. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev.egg-info/SOURCES.txt +9 -1
  35. omdev-0.0.0.dev32/omdev.egg-info/entry_points.txt +2 -0
  36. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev.egg-info/requires.txt +1 -1
  37. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/pyproject.toml +5 -2
  38. omdev-0.0.0.dev31/omdev/.manifests.json +0 -1
  39. omdev-0.0.0.dev31/omdev/amalg/__main__.py +0 -4
  40. omdev-0.0.0.dev31/omdev/interp/__main__.py +0 -4
  41. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/LICENSE +0 -0
  42. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/MANIFEST.in +0 -0
  43. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/README.rst +0 -0
  44. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/__init__.py +0 -0
  45. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/amalg/__init__.py +0 -0
  46. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/bracepy.py +0 -0
  47. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cache/__init__.py +0 -0
  48. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cache/compute/__init__.py +0 -0
  49. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cache/compute/cache.py +0 -0
  50. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cache/compute/contexts.py +0 -0
  51. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cache/compute/currents.py +0 -0
  52. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cache/compute/fns.py +0 -0
  53. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cache/compute/resolvers.py +0 -0
  54. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cache/compute/storage.py +0 -0
  55. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cache/compute/types.py +0 -0
  56. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cache/data/__init__.py +0 -0
  57. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cache/data/actions.py +0 -0
  58. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cache/data/cache.py +0 -0
  59. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cache/data/consts.py +0 -0
  60. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cache/data/defaults.py +0 -0
  61. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cache/data/manifests.py +0 -0
  62. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cache/data/specs.py +0 -0
  63. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cexts/__init__.py +0 -0
  64. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/LICENSE +0 -0
  65. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/__init__.py +0 -0
  66. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/build_ext.py +0 -0
  67. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  68. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  69. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/compilers/options.py +0 -0
  70. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  71. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/dir_util.py +0 -0
  72. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/errors.py +0 -0
  73. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/extension.py +0 -0
  74. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/file_util.py +0 -0
  75. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/modified.py +0 -0
  76. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/spawn.py +0 -0
  77. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/sysconfig.py +0 -0
  78. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/util.py +0 -0
  79. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cexts/_distutils/version.py +0 -0
  80. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cexts/build.py +0 -0
  81. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cexts/importhook.py +0 -0
  82. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cexts/scan.py +0 -0
  83. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/cmake.py +0 -0
  84. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/findimports.py +0 -0
  85. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/findmagic.py +0 -0
  86. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/git.py +0 -0
  87. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/interp/__init__.py +0 -0
  88. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/interp/inspect.py +0 -0
  89. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/interp/providers.py +0 -0
  90. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/interp/resolvers.py +0 -0
  91. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/interp/standalone.py +0 -0
  92. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/interp/system.py +0 -0
  93. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/interp/types.py +0 -0
  94. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/mypy/__init__.py +0 -0
  95. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/mypy/debug.py +0 -0
  96. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/precheck/__init__.py +0 -0
  97. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/precheck/__main__.py +0 -0
  98. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/precheck/base.py +0 -0
  99. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/precheck/git.py +0 -0
  100. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/precheck/lite.py +0 -0
  101. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/precheck/scripts.py +0 -0
  102. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/pyproject/__init__.py +0 -0
  103. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/pyproject/cexts.py +0 -0
  104. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/pyproject/configs.py +0 -0
  105. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/revisions.py +0 -0
  106. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/scripts/__init__.py +0 -0
  107. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/scripts/bumpversion.py +0 -0
  108. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/scripts/execrss.py +0 -0
  109. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/secrets.py +0 -0
  110. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/tokens.py +0 -0
  111. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/toml/__init__.py +0 -0
  112. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/toml/parser.py +0 -0
  113. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/tools/__init__.py +0 -0
  114. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/tools/importscan.py +0 -0
  115. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/tools/importtrace.py +0 -0
  116. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/tools/rst.py +0 -0
  117. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/versioning/__init__.py +0 -0
  118. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/versioning/specifiers.py +0 -0
  119. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/versioning/versions.py +0 -0
  120. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev/wheelfile.py +0 -0
  121. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev.egg-info/dependency_links.txt +0 -0
  122. {omdev-0.0.0.dev31 → omdev-0.0.0.dev32}/omdev.egg-info/top_level.txt +0 -0
  123. {omdev-0.0.0.dev31 → 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.dev31
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.dev31
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,16 +1,14 @@
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
-
7
- TODO opts:
8
- - --enable-loadable-sqlite-extensions LDFLAGS="-L/opt/homebrew/opt/sqlite/lib" CPPFLAGS="-I/opt/homebrew/opt/sqlite/include"
9
- - --enable-shared
10
- - --enable-optimizations
11
- - --enable-profiling ?
12
- - --enable-ipv6 ?
13
- """ # noqa
11
+ """
14
12
  # ruff: noqa: UP006 UP007
15
13
  import abc
16
14
  import dataclasses as dc
@@ -129,8 +127,33 @@ class PyenvInstallOpts:
129
127
  )
130
128
 
131
129
 
132
- 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
+
133
155
  DEBUG_PYENV_INSTALL_OPTS = PyenvInstallOpts(opts=['-g'])
156
+
134
157
  THREADED_PYENV_INSTALL_OPTS = PyenvInstallOpts(conf_opts=['--disable-gil'])
135
158
 
136
159
 
@@ -229,6 +252,7 @@ class PyenvVersionInstaller:
229
252
  opts: ta.Optional[PyenvInstallOpts] = None,
230
253
  interp_opts: InterpOpts = InterpOpts(),
231
254
  *,
255
+ install_name: ta.Optional[str] = None,
232
256
  no_default_opts: bool = False,
233
257
  pyenv: Pyenv = Pyenv(),
234
258
  ) -> None:
@@ -249,6 +273,7 @@ class PyenvVersionInstaller:
249
273
  self._version = version
250
274
  self._opts = opts
251
275
  self._interp_opts = interp_opts
276
+ self._given_install_name = install_name
252
277
 
253
278
  self._no_default_opts = no_default_opts
254
279
  self._pyenv = pyenv
@@ -263,6 +288,8 @@ class PyenvVersionInstaller:
263
288
 
264
289
  @cached_nullary
265
290
  def install_name(self) -> str:
291
+ if self._given_install_name is not None:
292
+ return self._given_install_name
266
293
  return self._version + ('-debug' if self._interp_opts.debug else '')
267
294
 
268
295
  @cached_nullary
@@ -282,11 +309,26 @@ class PyenvVersionInstaller:
282
309
  v += ' ' + os.environ[k]
283
310
  env[k] = v
284
311
 
285
- subprocess_check_call(
286
- self._pyenv.exe(),
287
- 'install',
312
+ conf_args = [
288
313
  *self._opts.opts,
289
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,
290
332
  env=env,
291
333
  )
292
334
 
@@ -0,0 +1,2 @@
1
+ # @omlish-lite
2
+ from .types import Manifest # noqa
@@ -1,15 +1,18 @@
1
1
  """
2
2
  TODO:
3
- - split, cli.py / types.py
4
- - opt to load only specified types
5
- - prechecks
3
+ - relative keys - if startswith self pkg then `$.foo.bar`
4
+
5
+ - See (entry_points):
6
+ - https://github.com/pytest-dev/pluggy/blob/main/src/pluggy/_manager.py#L405
7
+ - https://docs.pytest.org/en/7.1.x/how-to/writing_plugins.html#setuptools-entry-points
8
+ - https://packaging.python.org/en/latest/specifications/entry-points/
9
+ - https://packaging.python.org/en/latest/guides/creating-and-discovering-plugins/
10
+ - [project.entry-points.omlish-manifests] \n omdev = omdev
6
11
  """
7
12
  # ruff: noqa: UP006 UP007
8
- # @omlish-lite
9
13
  import argparse
10
14
  import collections
11
15
  import dataclasses as dc
12
- import importlib
13
16
  import inspect
14
17
  import json
15
18
  import os.path
@@ -25,57 +28,10 @@ from omlish.lite.json import json_dumps_pretty
25
28
  from omlish.lite.logs import configure_standard_logging
26
29
  from omlish.lite.logs import log
27
30
 
28
- from . import findmagic
29
-
30
-
31
- ##
32
-
33
-
34
- @dc.dataclass(frozen=True)
35
- class ManifestOrigin:
36
- module: str
37
- attr: str
38
-
39
- file: str
40
- line: int
41
-
42
-
43
- @dc.dataclass(frozen=True)
44
- class Manifest(ManifestOrigin):
45
- value: ta.Any
46
-
47
-
48
- def load_manifest_entry(
49
- entry: ta.Mapping[str, ta.Any],
50
- *,
51
- raw_values: bool = False,
52
- ) -> Manifest:
53
- manifest = Manifest(**entry)
54
-
55
- [(key, value_dct)] = manifest.value.items()
56
- if not key.startswith('$'):
57
- raise Exception(f'Bad key: {key}')
58
-
59
- if not raw_values:
60
- parts = key[1:].split('.')
61
- pos = next(i for i, p in enumerate(parts) if p[0].isupper())
62
- mod_name = '.'.join(parts[:pos])
63
- mod = importlib.import_module(mod_name)
64
-
65
- obj: ta.Any = mod
66
- for ca in parts[pos:]:
67
- obj = getattr(obj, ca)
68
- cls = obj
69
- if not isinstance(cls, type):
70
- raise TypeError(cls)
71
-
72
- if not dc.is_dataclass(cls):
73
- raise TypeError(cls)
74
- obj = cls(**value_dct) # noqa
75
-
76
- manifest = dc.replace(manifest, value=obj)
77
-
78
- return manifest
31
+ from .. import findmagic
32
+ from .load import ManifestLoader
33
+ from .types import Manifest
34
+ from .types import ManifestOrigin
79
35
 
80
36
 
81
37
  ##
@@ -218,9 +174,16 @@ def build_module_manifests(
218
174
 
219
175
  if not (
220
176
  isinstance(value, ta.Mapping) and
177
+ len(value) == 1 and
221
178
  all(isinstance(k, str) and k.startswith('$') and len(k) > 1 for k in value)
222
179
  ):
223
- raise TypeError(f'Manifests must be mapping of strings starting with $: {value!r}')
180
+ raise TypeError(f'Manifests must be mappings of strings starting with $: {value!r}')
181
+
182
+ [(key, value_dct)] = value.items()
183
+ kb, _, kr = key[1:].partition('.') # noqa
184
+ if kb == mod_base: # noqa
185
+ key = f'$.{kr}'
186
+ value = {key: value_dct}
224
187
 
225
188
  out.append(Manifest(
226
189
  **dc.asdict(o),
@@ -275,8 +238,14 @@ def check_package_manifests(
275
238
  with open(manifests_file) as f:
276
239
  manifests_json = json.load(f)
277
240
 
241
+ ldr = ManifestLoader()
278
242
  for entry in manifests_json:
279
- load_manifest_entry(entry)
243
+ manifest = Manifest(**entry)
244
+ [(key, value_dct)] = manifest.value.items()
245
+ if key.startswith('$.'):
246
+ key = f'${name}{key[1:]}'
247
+ cls = ldr.load_cls(key)
248
+ value = cls(**value_dct) # noqa
280
249
 
281
250
 
282
251
  ##