omdev 0.0.0.dev78__tar.gz → 0.0.0.dev80__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.
- {omdev-0.0.0.dev78/omdev.egg-info → omdev-0.0.0.dev80}/PKG-INFO +2 -2
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/.manifests.json +42 -6
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/amalg/amalg.py +31 -1
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/bracepy.py +7 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/classdot.py +1 -1
- omdev-0.0.0.dev80/omdev/cli/main.py +288 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/findimports.py +10 -4
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/findmagic.py +7 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/manifests/build.py +1 -1
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/precheck/__main__.py +1 -1
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/precheck/lite.py +12 -7
- omdev-0.0.0.dev78/omdev/precheck/precheck.py → omdev-0.0.0.dev80/omdev/precheck/main.py +7 -3
- omdev-0.0.0.dev80/omdev/precheck/manifests.py +26 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/scripts/execrss.py +1 -1
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/scripts/exectime.py +1 -1
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/scripts/importtrace.py +1 -1
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/scripts/pyproject.py +7 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/tools/importscan.py +1 -1
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/tools/mkrelimp.py +1 -1
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80/omdev.egg-info}/PKG-INFO +2 -2
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev.egg-info/SOURCES.txt +2 -1
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev.egg-info/requires.txt +1 -1
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/pyproject.toml +2 -2
- omdev-0.0.0.dev78/omdev/cli/main.py +0 -167
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/LICENSE +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/MANIFEST.in +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/README.rst +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/__about__.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/__init__.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/amalg/__init__.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/amalg/__main__.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/antlr/__init__.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/antlr/_antlr/__init__.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/antlr/consts.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/antlr/gen.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cache/__init__.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cache/compute/__init__.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cache/compute/cache.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cache/compute/contexts.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cache/compute/currents.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cache/compute/fns.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cache/compute/resolvers.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cache/compute/storage.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cache/compute/types.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cache/data/__init__.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cache/data/actions.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cache/data/cache.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cache/data/consts.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cache/data/defaults.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cache/data/manifests.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cache/data/specs.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cexts/__init__.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cexts/_boilerplate.cc +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cexts/_distutils/LICENSE +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cexts/_distutils/__init__.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cexts/_distutils/build_ext.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cexts/_distutils/compilers/options.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cexts/_distutils/dir_util.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cexts/_distutils/errors.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cexts/_distutils/extension.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cexts/_distutils/file_util.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cexts/_distutils/modified.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cexts/_distutils/spawn.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cexts/_distutils/sysconfig.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cexts/_distutils/util.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cexts/_distutils/version.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cexts/build.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cexts/cmake.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cexts/importhook.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cexts/magic.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cexts/scan.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cli/__init__.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cli/__main__.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cli/_pathhack.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cli/clicli.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cli/install.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cli/managers.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cli/types.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/cmake.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/git.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/imgur.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/interp/__init__.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/interp/__main__.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/interp/cli.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/interp/inspect.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/interp/providers.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/interp/pyenv.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/interp/resolvers.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/interp/standalone.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/interp/system.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/interp/types.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/manifests/__init__.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/manifests/load.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/manifests/types.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/mypy/__init__.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/mypy/debug.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/packaging/__init__.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/packaging/names.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/packaging/requires.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/packaging/specifiers.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/packaging/versions.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/precheck/__init__.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/precheck/base.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/precheck/git.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/precheck/scripts.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/pyproject/__init__.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/pyproject/__main__.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/pyproject/cexts.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/pyproject/cli.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/pyproject/configs.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/pyproject/pkg.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/pyproject/reqs.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/revisions.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/scripts/__init__.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/scripts/bumpversion.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/scripts/interp.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/secrets.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/tokens.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/toml/__init__.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/toml/parser.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/toml/writer.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/tools/__init__.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/tools/dockertools.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/tools/gittools.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/tools/nbtools.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/tools/piptools.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/tools/proftools.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/tools/rsttool.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/tools/sqlrepl.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev/wheelfile.py +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev.egg-info/dependency_links.txt +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev.egg-info/entry_points.txt +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/omdev.egg-info/top_level.txt +0 -0
- {omdev-0.0.0.dev78 → omdev-0.0.0.dev80}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: omdev
|
|
3
|
-
Version: 0.0.0.
|
|
3
|
+
Version: 0.0.0.dev80
|
|
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.dev80
|
|
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,18 @@
|
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
13
|
},
|
|
14
|
+
{
|
|
15
|
+
"module": ".bracepy",
|
|
16
|
+
"attr": "_CLI_MODULE",
|
|
17
|
+
"file": "omdev/bracepy.py",
|
|
18
|
+
"line": 88,
|
|
19
|
+
"value": {
|
|
20
|
+
"$.cli.types.CliModule": {
|
|
21
|
+
"cmd_name": "bracepy",
|
|
22
|
+
"mod_name": "omdev.bracepy"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
},
|
|
14
26
|
{
|
|
15
27
|
"module": ".cexts.cmake",
|
|
16
28
|
"attr": "_CLI_MODULE",
|
|
@@ -30,7 +42,7 @@
|
|
|
30
42
|
"line": 62,
|
|
31
43
|
"value": {
|
|
32
44
|
"$.cli.types.CliModule": {
|
|
33
|
-
"cmd_name": "classdot",
|
|
45
|
+
"cmd_name": "py/classdot",
|
|
34
46
|
"mod_name": "omdev.classdot"
|
|
35
47
|
}
|
|
36
48
|
}
|
|
@@ -47,6 +59,30 @@
|
|
|
47
59
|
}
|
|
48
60
|
}
|
|
49
61
|
},
|
|
62
|
+
{
|
|
63
|
+
"module": ".findimports",
|
|
64
|
+
"attr": "_CLI_MODULE",
|
|
65
|
+
"file": "omdev/findimports.py",
|
|
66
|
+
"line": 81,
|
|
67
|
+
"value": {
|
|
68
|
+
"$.cli.types.CliModule": {
|
|
69
|
+
"cmd_name": "py/findimports",
|
|
70
|
+
"mod_name": "omdev.findimports"
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"module": ".findmagic",
|
|
76
|
+
"attr": "_CLI_MODULE",
|
|
77
|
+
"file": "omdev/findmagic.py",
|
|
78
|
+
"line": 65,
|
|
79
|
+
"value": {
|
|
80
|
+
"$.cli.types.CliModule": {
|
|
81
|
+
"cmd_name": "py/findmagic",
|
|
82
|
+
"mod_name": "omdev.findmagic"
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
},
|
|
50
86
|
{
|
|
51
87
|
"module": ".imgur",
|
|
52
88
|
"attr": "_FOO_CLI_MODULE",
|
|
@@ -102,7 +138,7 @@
|
|
|
102
138
|
"line": 11,
|
|
103
139
|
"value": {
|
|
104
140
|
"$.cli.types.CliModule": {
|
|
105
|
-
"cmd_name": "execrss",
|
|
141
|
+
"cmd_name": "py/execrss",
|
|
106
142
|
"mod_name": "omdev.scripts.execrss"
|
|
107
143
|
}
|
|
108
144
|
}
|
|
@@ -114,7 +150,7 @@
|
|
|
114
150
|
"line": 7,
|
|
115
151
|
"value": {
|
|
116
152
|
"$.cli.types.CliModule": {
|
|
117
|
-
"cmd_name": "exectime",
|
|
153
|
+
"cmd_name": "py/exectime",
|
|
118
154
|
"mod_name": "omdev.scripts.exectime"
|
|
119
155
|
}
|
|
120
156
|
}
|
|
@@ -126,7 +162,7 @@
|
|
|
126
162
|
"line": 481,
|
|
127
163
|
"value": {
|
|
128
164
|
"$.cli.types.CliModule": {
|
|
129
|
-
"cmd_name": "importtrace",
|
|
165
|
+
"cmd_name": "py/importtrace",
|
|
130
166
|
"mod_name": "omdev.scripts.importtrace"
|
|
131
167
|
}
|
|
132
168
|
}
|
|
@@ -162,7 +198,7 @@
|
|
|
162
198
|
"line": 166,
|
|
163
199
|
"value": {
|
|
164
200
|
"$.cli.types.CliModule": {
|
|
165
|
-
"cmd_name": "importscan",
|
|
201
|
+
"cmd_name": "py/importscan",
|
|
166
202
|
"mod_name": "omdev.tools.importscan"
|
|
167
203
|
}
|
|
168
204
|
}
|
|
@@ -174,7 +210,7 @@
|
|
|
174
210
|
"line": 148,
|
|
175
211
|
"value": {
|
|
176
212
|
"$.cli.types.CliModule": {
|
|
177
|
-
"cmd_name": "mkrelimp",
|
|
213
|
+
"cmd_name": "py/mkrelimp",
|
|
178
214
|
"mod_name": "omdev.tools.mkrelimp"
|
|
179
215
|
}
|
|
180
216
|
}
|
|
@@ -24,6 +24,7 @@ Targets:
|
|
|
24
24
|
- supervisor?
|
|
25
25
|
"""
|
|
26
26
|
import argparse
|
|
27
|
+
import ast
|
|
27
28
|
import dataclasses as dc
|
|
28
29
|
import io
|
|
29
30
|
import logging
|
|
@@ -297,7 +298,11 @@ def make_src_file(
|
|
|
297
298
|
tys: list[Typing] = []
|
|
298
299
|
ctls: list[Tokens] = []
|
|
299
300
|
|
|
300
|
-
|
|
301
|
+
i = 0
|
|
302
|
+
while i < len(cls):
|
|
303
|
+
line = cls[i]
|
|
304
|
+
i += 1
|
|
305
|
+
|
|
301
306
|
if (imp := make_import(
|
|
302
307
|
line,
|
|
303
308
|
src_path=path,
|
|
@@ -311,6 +316,31 @@ def make_src_file(
|
|
|
311
316
|
)) is not None:
|
|
312
317
|
tys.append(ty)
|
|
313
318
|
|
|
319
|
+
elif (
|
|
320
|
+
line and
|
|
321
|
+
(ft := line[0]).name == 'COMMENT' and
|
|
322
|
+
ft.src.startswith('# @omlish-manifest')
|
|
323
|
+
):
|
|
324
|
+
mls = [line]
|
|
325
|
+
while True:
|
|
326
|
+
mls.append(cls[i])
|
|
327
|
+
i += 1
|
|
328
|
+
|
|
329
|
+
msrc = tks.join_lines(mls).strip()
|
|
330
|
+
try:
|
|
331
|
+
node = ast.parse(msrc)
|
|
332
|
+
except SyntaxError:
|
|
333
|
+
continue
|
|
334
|
+
|
|
335
|
+
mmod = check.isinstance(node, ast.Module)
|
|
336
|
+
check.isinstance(check.single(mmod.body), ast.Assign)
|
|
337
|
+
break
|
|
338
|
+
|
|
339
|
+
ctls.extend([
|
|
340
|
+
[trt.Token('COMMENT', '# ' + tks.join_toks(ml))]
|
|
341
|
+
for ml in mls
|
|
342
|
+
])
|
|
343
|
+
|
|
314
344
|
else:
|
|
315
345
|
ctls.append(line)
|
|
316
346
|
|
|
@@ -85,6 +85,13 @@ def translate_brace_python(
|
|
|
85
85
|
return ret.getvalue()
|
|
86
86
|
|
|
87
87
|
|
|
88
|
+
# @omlish-manifest
|
|
89
|
+
_CLI_MODULE = {'$omdev.cli.types.CliModule': {
|
|
90
|
+
'cmd_name': 'bracepy',
|
|
91
|
+
'mod_name': __name__,
|
|
92
|
+
}}
|
|
93
|
+
|
|
94
|
+
|
|
88
95
|
if __name__ == '__main__':
|
|
89
96
|
def _main(argv=None) -> None:
|
|
90
97
|
import argparse
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
"""
|
|
2
|
+
TODO:
|
|
3
|
+
- py/foo - root command 'py'
|
|
4
|
+
- cache ldr.discover() somehow if in uvx/pipx - very slow
|
|
5
|
+
- <venv-root>/.omdev-cli-manifest-cache.json - {pkg_name: manifests_json}
|
|
6
|
+
- allow manually specifying manifest packages
|
|
7
|
+
"""
|
|
8
|
+
import argparse
|
|
9
|
+
import dataclasses as dc
|
|
10
|
+
import os
|
|
11
|
+
import runpy
|
|
12
|
+
import sys
|
|
13
|
+
import typing as ta
|
|
14
|
+
|
|
15
|
+
from omlish import check
|
|
16
|
+
from omlish.lite.cached import cached_nullary
|
|
17
|
+
|
|
18
|
+
from ..manifests.load import ManifestLoader
|
|
19
|
+
from .types import CliCmd
|
|
20
|
+
from .types import CliFunc
|
|
21
|
+
from .types import CliModule
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
##
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _post_install(cli_pkg: str) -> None:
|
|
28
|
+
from .managers import setup_install_manager
|
|
29
|
+
|
|
30
|
+
setup_install_manager(cli_pkg)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
##
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
_CLI_FUNCS: ta.Sequence[CliFunc] = [
|
|
37
|
+
CliFunc('_post_install', _post_install),
|
|
38
|
+
]
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
##
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
StrTuple: ta.TypeAlias = tuple[str, ...]
|
|
45
|
+
RecStrMap: ta.TypeAlias = ta.Mapping[str, ta.Union[str, 'RecStrMap']]
|
|
46
|
+
RecCmdMap: ta.TypeAlias = ta.Mapping[str, ta.Union[CliCmd, 'RecCmdMap']]
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class CliCmdSet:
|
|
50
|
+
def __init__(self, cmds: ta.Iterable[CliCmd]) -> None:
|
|
51
|
+
super().__init__()
|
|
52
|
+
|
|
53
|
+
self._cmds = list(cmds)
|
|
54
|
+
|
|
55
|
+
@dc.dataclass(frozen=True)
|
|
56
|
+
class Entry:
|
|
57
|
+
cmd: CliCmd
|
|
58
|
+
|
|
59
|
+
exec_paths: ta.Sequence[StrTuple] # len > 1, len([0]) > 1
|
|
60
|
+
help_path: StrTuple | None
|
|
61
|
+
|
|
62
|
+
def _make_entry(self, cmd: CliCmd) -> Entry:
|
|
63
|
+
help_path: StrTuple | None
|
|
64
|
+
|
|
65
|
+
if isinstance(cmd.cmd_name, str):
|
|
66
|
+
ns = [cmd.cmd_name]
|
|
67
|
+
else:
|
|
68
|
+
ns = list(cmd.cmd_name)
|
|
69
|
+
exec_paths = [tuple(n.split('/')) for n in ns]
|
|
70
|
+
|
|
71
|
+
if isinstance(cmd.cmd_name, str) and cmd.cmd_name[0] == '_':
|
|
72
|
+
help_path = None
|
|
73
|
+
|
|
74
|
+
elif isinstance(cmd, CliFunc):
|
|
75
|
+
help_path = ('-', *exec_paths[0])
|
|
76
|
+
|
|
77
|
+
elif isinstance(cmd, CliModule):
|
|
78
|
+
help_path = (cmd.mod_name.partition('.')[0], *exec_paths[0])
|
|
79
|
+
|
|
80
|
+
else:
|
|
81
|
+
raise TypeError(cmd)
|
|
82
|
+
|
|
83
|
+
return CliCmdSet.Entry(
|
|
84
|
+
cmd,
|
|
85
|
+
|
|
86
|
+
exec_paths=exec_paths,
|
|
87
|
+
help_path=help_path,
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
@cached_nullary
|
|
91
|
+
def entries(self) -> ta.Sequence[Entry]:
|
|
92
|
+
return [self._make_entry(c) for c in self._cmds]
|
|
93
|
+
|
|
94
|
+
@cached_nullary
|
|
95
|
+
def exec_tree(self) -> RecCmdMap:
|
|
96
|
+
d: dict = {}
|
|
97
|
+
for e in self.entries():
|
|
98
|
+
for ep in e.exec_paths:
|
|
99
|
+
c = d
|
|
100
|
+
for p in ep[:-1]:
|
|
101
|
+
n = c.setdefault(p, {})
|
|
102
|
+
if not isinstance(n, dict):
|
|
103
|
+
raise NameError(e) # noqa
|
|
104
|
+
c = n
|
|
105
|
+
|
|
106
|
+
h = ep[-1]
|
|
107
|
+
if h in c:
|
|
108
|
+
raise NameError(e) # noqa
|
|
109
|
+
|
|
110
|
+
c[h] = e.cmd
|
|
111
|
+
|
|
112
|
+
return d
|
|
113
|
+
|
|
114
|
+
@cached_nullary
|
|
115
|
+
def help_tree(self) -> RecStrMap:
|
|
116
|
+
d: dict = {}
|
|
117
|
+
for e in self.entries():
|
|
118
|
+
if not e.help_path:
|
|
119
|
+
continue
|
|
120
|
+
|
|
121
|
+
c = d
|
|
122
|
+
for p in e.help_path[:-1]:
|
|
123
|
+
n = c.setdefault(p, {})
|
|
124
|
+
if not isinstance(n, dict):
|
|
125
|
+
raise NameError(e) # noqa
|
|
126
|
+
c = n
|
|
127
|
+
|
|
128
|
+
h = e.help_path[-1]
|
|
129
|
+
if h in c:
|
|
130
|
+
raise NameError(e)
|
|
131
|
+
|
|
132
|
+
if isinstance(e.cmd.cmd_name, str):
|
|
133
|
+
l = [e.cmd.cmd_name]
|
|
134
|
+
else:
|
|
135
|
+
l = list(e.cmd.cmd_name)
|
|
136
|
+
|
|
137
|
+
s = (
|
|
138
|
+
f'{l[0].split("/")[-1]}'
|
|
139
|
+
f'{(" (" + ", ".join(l[1:]) + ")") if len(l) > 1 else ""}'
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
c[h] = s
|
|
143
|
+
|
|
144
|
+
return d
|
|
145
|
+
|
|
146
|
+
class SelectedCmd(ta.NamedTuple):
|
|
147
|
+
cmd: CliCmd
|
|
148
|
+
args: ta.Sequence[str]
|
|
149
|
+
|
|
150
|
+
class InvalidCmd(ta.NamedTuple):
|
|
151
|
+
path: ta.Sequence[str]
|
|
152
|
+
|
|
153
|
+
def select_cmd(self, args: ta.Sequence[str]) -> SelectedCmd | InvalidCmd:
|
|
154
|
+
check.not_isinstance(args, str)
|
|
155
|
+
|
|
156
|
+
d = self.exec_tree()
|
|
157
|
+
for i in range(len(args)):
|
|
158
|
+
n = args[i]
|
|
159
|
+
if n not in d:
|
|
160
|
+
return CliCmdSet.InvalidCmd(args[:i + 1])
|
|
161
|
+
|
|
162
|
+
c = d[n]
|
|
163
|
+
|
|
164
|
+
if isinstance(c, CliCmd):
|
|
165
|
+
return CliCmdSet.SelectedCmd(c, args[i + 1:])
|
|
166
|
+
elif isinstance(c, ta.Mapping):
|
|
167
|
+
d = c
|
|
168
|
+
else:
|
|
169
|
+
raise TypeError(c)
|
|
170
|
+
|
|
171
|
+
return CliCmdSet.InvalidCmd([])
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
##
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def _build_arg_parser() -> argparse.ArgumentParser:
|
|
178
|
+
parser = argparse.ArgumentParser()
|
|
179
|
+
parser.add_argument('--cli-pkg-root', action='append')
|
|
180
|
+
parser.add_argument('--cli-debug', action='store_true')
|
|
181
|
+
parser.add_argument('cmd', nargs='?')
|
|
182
|
+
parser.add_argument('args', nargs=argparse.REMAINDER)
|
|
183
|
+
return parser
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def _build_cmd_set(args: ta.Any) -> CliCmdSet:
|
|
187
|
+
ldr = ManifestLoader.from_entry_point(globals())
|
|
188
|
+
|
|
189
|
+
pkgs: list[str] = []
|
|
190
|
+
|
|
191
|
+
def scan_pkg_root(r: str) -> None:
|
|
192
|
+
r = os.path.expanduser(r)
|
|
193
|
+
for n in os.listdir(r):
|
|
194
|
+
if os.path.isdir(p := os.path.join(r, n)) and os.path.exists(os.path.join(p, '__init__.py')):
|
|
195
|
+
pkgs.append(n)
|
|
196
|
+
|
|
197
|
+
if args.cli_pkg_root:
|
|
198
|
+
for r in args.cli_pkg_root:
|
|
199
|
+
scan_pkg_root(r)
|
|
200
|
+
|
|
201
|
+
else:
|
|
202
|
+
pkgs.extend(ldr.discover())
|
|
203
|
+
|
|
204
|
+
if not pkgs:
|
|
205
|
+
scan_pkg_root(os.getcwd())
|
|
206
|
+
|
|
207
|
+
#
|
|
208
|
+
|
|
209
|
+
lst: list[CliCmd] = []
|
|
210
|
+
|
|
211
|
+
for m in ldr.load(*pkgs, only=[CliModule]):
|
|
212
|
+
lst.append(check.isinstance(m.value, CliModule))
|
|
213
|
+
|
|
214
|
+
lst.extend(_CLI_FUNCS)
|
|
215
|
+
|
|
216
|
+
#
|
|
217
|
+
|
|
218
|
+
return CliCmdSet(lst)
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
def _select_cmd(args: ta.Any, cmds: CliCmdSet) -> CliCmdSet.SelectedCmd | int:
|
|
222
|
+
def print_err(*args, **kwargs): # noqa
|
|
223
|
+
print(*args, **kwargs, file=sys.stderr)
|
|
224
|
+
|
|
225
|
+
if args.cmd:
|
|
226
|
+
sel_cmd = cmds.select_cmd([args.cmd, *args.args])
|
|
227
|
+
if isinstance(sel_cmd, CliCmdSet.SelectedCmd):
|
|
228
|
+
return sel_cmd
|
|
229
|
+
elif isinstance(sel_cmd, CliCmdSet.InvalidCmd):
|
|
230
|
+
print_err(f'Invalid command: {" ".join(sel_cmd.path)}\n')
|
|
231
|
+
else:
|
|
232
|
+
raise TypeError(sel_cmd)
|
|
233
|
+
rc = 1
|
|
234
|
+
else:
|
|
235
|
+
rc = 0
|
|
236
|
+
|
|
237
|
+
print_err('Subcommands:\n')
|
|
238
|
+
|
|
239
|
+
def rec(d, pfx=''):
|
|
240
|
+
for k, v in sorted(d.items(), key=lambda t: t[0]):
|
|
241
|
+
if isinstance(v, str):
|
|
242
|
+
print_err(pfx + v)
|
|
243
|
+
else:
|
|
244
|
+
print_err(pfx + k)
|
|
245
|
+
rec(v, pfx + ' ')
|
|
246
|
+
if not pfx:
|
|
247
|
+
print_err('')
|
|
248
|
+
|
|
249
|
+
rec(cmds.help_tree())
|
|
250
|
+
|
|
251
|
+
return rc
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
def _main() -> ta.Any:
|
|
255
|
+
parser = _build_arg_parser()
|
|
256
|
+
args = parser.parse_args()
|
|
257
|
+
|
|
258
|
+
def inner():
|
|
259
|
+
cmds = _build_cmd_set(args)
|
|
260
|
+
sel = _select_cmd(args, cmds)
|
|
261
|
+
|
|
262
|
+
if isinstance(sel, int):
|
|
263
|
+
return sel
|
|
264
|
+
|
|
265
|
+
cmd = sel.cmd
|
|
266
|
+
if isinstance(cmd, CliModule):
|
|
267
|
+
sys.argv = [args.cmd, *(sel.args or ())]
|
|
268
|
+
runpy._run_module_as_main(cmd.mod_name) # type: ignore # noqa
|
|
269
|
+
return 0
|
|
270
|
+
|
|
271
|
+
elif isinstance(cmd, CliFunc):
|
|
272
|
+
return cmd.fn(*(sel.args or ()))
|
|
273
|
+
|
|
274
|
+
else:
|
|
275
|
+
raise TypeError(cmd)
|
|
276
|
+
|
|
277
|
+
if args.cli_debug:
|
|
278
|
+
from omlish.diag.debug import debugging_on_exception
|
|
279
|
+
|
|
280
|
+
with debugging_on_exception():
|
|
281
|
+
return inner()
|
|
282
|
+
|
|
283
|
+
else:
|
|
284
|
+
return inner()
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
if __name__ == '__main__':
|
|
288
|
+
sys.exit(rc if isinstance(rc := _main(), int) else 0)
|
|
@@ -78,11 +78,17 @@ def get_import_deps(imps: set[str]) -> set[str]:
|
|
|
78
78
|
return {i for i in eimps if whichmod(i) != 'builtin'}
|
|
79
79
|
|
|
80
80
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
81
|
+
# @omlish-manifest
|
|
82
|
+
_CLI_MODULE = {'$omdev.cli.types.CliModule': {
|
|
83
|
+
'cmd_name': 'py/findimports',
|
|
84
|
+
'mod_name': __name__,
|
|
85
|
+
}}
|
|
85
86
|
|
|
86
87
|
|
|
87
88
|
if __name__ == '__main__':
|
|
89
|
+
def _main() -> None:
|
|
90
|
+
imps = find_imports(*sys.argv[1:])
|
|
91
|
+
deps = get_import_deps(imps)
|
|
92
|
+
print(chr(10).join(sorted(deps)))
|
|
93
|
+
|
|
88
94
|
_main()
|
|
@@ -62,6 +62,13 @@ def find_magic(
|
|
|
62
62
|
yield out
|
|
63
63
|
|
|
64
64
|
|
|
65
|
+
# @omlish-manifest
|
|
66
|
+
_CLI_MODULE = {'$omdev.cli.types.CliModule': {
|
|
67
|
+
'cmd_name': 'py/findmagic',
|
|
68
|
+
'mod_name': __name__,
|
|
69
|
+
}}
|
|
70
|
+
|
|
71
|
+
|
|
65
72
|
if __name__ == '__main__':
|
|
66
73
|
def _main(argv=None) -> None:
|
|
67
74
|
import argparse
|
|
@@ -10,6 +10,7 @@ import typing as ta
|
|
|
10
10
|
|
|
11
11
|
from omdev import findmagic
|
|
12
12
|
from omlish import cached
|
|
13
|
+
from omlish.lite.subprocesses import subprocess_maybe_shell_wrap_exec
|
|
13
14
|
|
|
14
15
|
from .base import Precheck
|
|
15
16
|
from .base import PrecheckContext
|
|
@@ -69,10 +70,12 @@ class LitePython8Precheck(Precheck['LitePython8Precheck.Config']):
|
|
|
69
70
|
vs: list[Precheck.Violation] = []
|
|
70
71
|
|
|
71
72
|
proc = await asyncio.create_subprocess_exec(
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
73
|
+
*subprocess_maybe_shell_wrap_exec(
|
|
74
|
+
'.venvs/8/bin/python',
|
|
75
|
+
'-c',
|
|
76
|
+
self._load_file_module_payload(),
|
|
77
|
+
fp,
|
|
78
|
+
),
|
|
76
79
|
stderr=subprocess.PIPE,
|
|
77
80
|
)
|
|
78
81
|
|
|
@@ -90,9 +93,11 @@ class LitePython8Precheck(Precheck['LitePython8Precheck.Config']):
|
|
|
90
93
|
log.debug('%s: loading module %s', self.__class__.__name__, mod)
|
|
91
94
|
|
|
92
95
|
proc = await asyncio.create_subprocess_exec(
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
+
*subprocess_maybe_shell_wrap_exec(
|
|
97
|
+
'.venvs/8/bin/python',
|
|
98
|
+
'-c',
|
|
99
|
+
f'import {mod}',
|
|
100
|
+
),
|
|
96
101
|
stderr=subprocess.PIPE,
|
|
97
102
|
)
|
|
98
103
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Tiny pre-commit
|
|
3
3
|
|
|
4
4
|
TODO:
|
|
5
|
-
-
|
|
5
|
+
- define new prechecks with manifests
|
|
6
6
|
- global config
|
|
7
7
|
- global analyses - FilesWithShebang
|
|
8
8
|
- shebang files have no relative imports
|
|
@@ -31,6 +31,7 @@ from .base import Precheck
|
|
|
31
31
|
from .base import PrecheckContext
|
|
32
32
|
from .git import GitBlacklistPrecheck
|
|
33
33
|
from .lite import LitePython8Precheck
|
|
34
|
+
from .manifests import ManifestsPrecheck
|
|
34
35
|
from .scripts import ScriptDepsPrecheck
|
|
35
36
|
|
|
36
37
|
|
|
@@ -52,6 +53,7 @@ def _check_cmd(args) -> None:
|
|
|
52
53
|
GitBlacklistPrecheck(ctx),
|
|
53
54
|
ScriptDepsPrecheck(ctx),
|
|
54
55
|
LitePython8Precheck(ctx),
|
|
56
|
+
ManifestsPrecheck(ctx),
|
|
55
57
|
]
|
|
56
58
|
|
|
57
59
|
async def run() -> list[Precheck.Violation]:
|
|
@@ -81,16 +83,18 @@ def _build_parser() -> argparse.ArgumentParser:
|
|
|
81
83
|
|
|
82
84
|
parser_check = subparsers.add_parser('check')
|
|
83
85
|
parser_check.add_argument('roots', nargs='+')
|
|
86
|
+
parser_check.add_argument('-v', '--verbose', action='store_true')
|
|
84
87
|
parser_check.set_defaults(func=_check_cmd)
|
|
85
88
|
|
|
86
89
|
return parser
|
|
87
90
|
|
|
88
91
|
|
|
89
92
|
def _main(argv: ta.Sequence[str] | None = None) -> None:
|
|
90
|
-
logs.configure_standard_logging('INFO')
|
|
91
|
-
|
|
92
93
|
parser = _build_parser()
|
|
93
94
|
args = parser.parse_args(argv)
|
|
95
|
+
|
|
96
|
+
logs.configure_standard_logging('DEBUG' if args.verbose else 'INFO')
|
|
97
|
+
|
|
94
98
|
if not getattr(args, 'func', None):
|
|
95
99
|
parser.print_help()
|
|
96
100
|
else:
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import dataclasses as dc
|
|
2
|
+
import typing as ta
|
|
3
|
+
|
|
4
|
+
from ..manifests.load import ManifestLoader
|
|
5
|
+
from .base import Precheck
|
|
6
|
+
from .base import PrecheckContext
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
##
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ManifestsPrecheck(Precheck['ManifestsPrecheck.Config']):
|
|
13
|
+
@dc.dataclass(frozen=True)
|
|
14
|
+
class Config(Precheck.Config):
|
|
15
|
+
pass
|
|
16
|
+
|
|
17
|
+
def __init__(self, context: PrecheckContext, config: Config = Config()) -> None:
|
|
18
|
+
super().__init__(context, config)
|
|
19
|
+
|
|
20
|
+
async def run(self) -> ta.AsyncGenerator[Precheck.Violation, None]:
|
|
21
|
+
for src_root in self._context.src_roots:
|
|
22
|
+
ml = ManifestLoader()
|
|
23
|
+
try:
|
|
24
|
+
ml.load(src_root)
|
|
25
|
+
except Exception as e: # noqa
|
|
26
|
+
yield Precheck.Violation(self, f'Error loading manifest for {src_root}: {e!r}')
|
|
@@ -170,6 +170,13 @@ def find_magic(
|
|
|
170
170
|
yield out
|
|
171
171
|
|
|
172
172
|
|
|
173
|
+
# # @omlish-manifest
|
|
174
|
+
# _CLI_MODULE = {'$omdev.cli.types.CliModule': {
|
|
175
|
+
# 'cmd_name': 'py/findmagic',
|
|
176
|
+
# 'mod_name': __name__,
|
|
177
|
+
# }}
|
|
178
|
+
|
|
179
|
+
|
|
173
180
|
########################################
|
|
174
181
|
# ../../git.py
|
|
175
182
|
|