omdev 0.0.0.dev24__py3-none-any.whl → 0.0.0.dev25__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of omdev might be problematic. Click here for more details.
- omdev/_manifests.json +1 -0
- omdev/cexts/_boilerplate.cc +82 -0
- omdev/cexts/_distutils/LICENSE +12 -0
- omdev/cexts/build.py +62 -18
- omdev/cexts/importhook.py +1 -1
- omdev/findmagic.py +7 -0
- omdev/manifests.py +225 -0
- omdev/pyproject/pkg.py +9 -3
- omdev/scripts/pyproject.py +16 -3
- {omdev-0.0.0.dev24.dist-info → omdev-0.0.0.dev25.dist-info}/METADATA +2 -2
- {omdev-0.0.0.dev24.dist-info → omdev-0.0.0.dev25.dist-info}/RECORD +14 -10
- {omdev-0.0.0.dev24.dist-info → omdev-0.0.0.dev25.dist-info}/LICENSE +0 -0
- {omdev-0.0.0.dev24.dist-info → omdev-0.0.0.dev25.dist-info}/WHEEL +0 -0
- {omdev-0.0.0.dev24.dist-info → omdev-0.0.0.dev25.dist-info}/top_level.txt +0 -0
omdev/_manifests.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[]
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// @omdev-cext
|
|
2
|
+
#define PY_SSIZE_T_CLEAN
|
|
3
|
+
#include "Python.h"
|
|
4
|
+
#include "structmember.h"
|
|
5
|
+
|
|
6
|
+
#include <unistd.h>
|
|
7
|
+
|
|
8
|
+
//
|
|
9
|
+
|
|
10
|
+
#define _MODULE_NAME "_boilerplate"
|
|
11
|
+
#define _PACKAGE_NAME "omdev.cexts"
|
|
12
|
+
#define _MODULE_FULL_NAME _PACKAGE_NAME "." _MODULE_NAME
|
|
13
|
+
|
|
14
|
+
typedef struct boilerplate_state {
|
|
15
|
+
} boilerplate_state;
|
|
16
|
+
|
|
17
|
+
static inline boilerplate_state * get_boilerplate_state(PyObject *module)
|
|
18
|
+
{
|
|
19
|
+
void *state = PyModule_GetState(module);
|
|
20
|
+
assert(state != NULL);
|
|
21
|
+
return (boilerplate_state *)state;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
//
|
|
25
|
+
|
|
26
|
+
PyDoc_STRVAR(boilerplate_doc, "boilerplate");
|
|
27
|
+
|
|
28
|
+
static int boilerplate_exec(PyObject *module)
|
|
29
|
+
{
|
|
30
|
+
get_boilerplate_state(module);
|
|
31
|
+
return 0;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
static int boilerplate_traverse(PyObject *module, visitproc visit, void *arg)
|
|
35
|
+
{
|
|
36
|
+
get_boilerplate_state(module);
|
|
37
|
+
return 0;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
static int boilerplate_clear(PyObject *module)
|
|
41
|
+
{
|
|
42
|
+
get_boilerplate_state(module);
|
|
43
|
+
return 0;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
static void boilerplate_free(void *module)
|
|
47
|
+
{
|
|
48
|
+
boilerplate_clear((PyObject *)module);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
static PyMethodDef boilerplate_methods[] = {
|
|
52
|
+
{NULL, NULL, 0, NULL}
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
static struct PyModuleDef_Slot boilerplate_slots[] = {
|
|
56
|
+
{Py_mod_exec, (void *) boilerplate_exec},
|
|
57
|
+
// #if PY_VERSION_HEX >= 0x030D0000
|
|
58
|
+
// {Py_mod_gil, Py_MOD_GIL_NOT_USED},
|
|
59
|
+
// #endif
|
|
60
|
+
{0, NULL}
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
static struct PyModuleDef boilerplate_module = {
|
|
64
|
+
.m_base = PyModuleDef_HEAD_INIT,
|
|
65
|
+
.m_name = _MODULE_NAME,
|
|
66
|
+
.m_doc = boilerplate_doc,
|
|
67
|
+
.m_size = sizeof(boilerplate_state),
|
|
68
|
+
.m_methods = boilerplate_methods,
|
|
69
|
+
.m_slots = boilerplate_slots,
|
|
70
|
+
.m_traverse = boilerplate_traverse,
|
|
71
|
+
.m_clear = boilerplate_clear,
|
|
72
|
+
.m_free = boilerplate_free,
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
extern "C" {
|
|
76
|
+
|
|
77
|
+
PyMODINIT_FUNC PyInit__boilerplate(void)
|
|
78
|
+
{
|
|
79
|
+
return PyModuleDef_Init(&boilerplate_module);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
|
|
2
|
+
documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
|
|
3
|
+
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
|
|
4
|
+
persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
5
|
+
|
|
6
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
|
|
7
|
+
Software.
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
|
10
|
+
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
11
|
+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
12
|
+
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
omdev/cexts/build.py
CHANGED
|
@@ -1,43 +1,87 @@
|
|
|
1
|
+
import dataclasses as dc
|
|
1
2
|
import os.path
|
|
2
3
|
import sys
|
|
3
4
|
import sysconfig
|
|
5
|
+
import typing as ta
|
|
6
|
+
|
|
7
|
+
from omlish import check
|
|
8
|
+
from omlish import lang
|
|
4
9
|
|
|
5
10
|
from . import _distutils as du
|
|
6
11
|
|
|
7
12
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
)
|
|
13
|
+
CPP_STD = 'c++20'
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dc.dataclass(frozen=True)
|
|
17
|
+
class BuildExt:
|
|
18
|
+
full_name: str
|
|
19
|
+
src_file: str
|
|
20
|
+
|
|
21
|
+
inplace: bool = dc.field(default=True, kw_only=True)
|
|
22
|
+
debug: bool = dc.field(default=True, kw_only=True)
|
|
23
|
+
force: bool = dc.field(default=False, kw_only=True)
|
|
24
|
+
|
|
25
|
+
dry_run: bool = dc.field(default=False, kw_only=True)
|
|
26
|
+
verbose: bool = dc.field(default=False, kw_only=True)
|
|
27
|
+
|
|
28
|
+
extra_src_files: lang.SequenceNotStr[str] | None = dc.field(default=None, kw_only=True)
|
|
29
|
+
include_dirs: lang.SequenceNotStr[str] | None = dc.field(default=None, kw_only=True)
|
|
30
|
+
compile_args: lang.SequenceNotStr[str] | None = dc.field(default=None, kw_only=True)
|
|
31
|
+
link_args: lang.SequenceNotStr[str] | None = dc.field(default=None, kw_only=True)
|
|
32
|
+
define_macros: ta.Sequence[tuple[str, str]] | None = dc.field(default=None, kw_only=True)
|
|
33
|
+
undef_macros: lang.SequenceNotStr[str] | None = dc.field(default=None, kw_only=True)
|
|
34
|
+
|
|
35
|
+
def __post_init__(self) -> None:
|
|
36
|
+
check.not_isinstance(self.compile_args, str)
|
|
37
|
+
check.not_isinstance(self.link_args, str)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def build_ext(ext: BuildExt) -> str:
|
|
12
41
|
extra_link_args: list[str] = []
|
|
13
42
|
if sys.platform == 'darwin':
|
|
14
43
|
extra_link_args.append('-Wl,-no_fixup_chains')
|
|
15
44
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
sources=[
|
|
19
|
-
|
|
45
|
+
du_ext = du.Extension(
|
|
46
|
+
ext.full_name,
|
|
47
|
+
sources=[
|
|
48
|
+
ext.src_file,
|
|
49
|
+
*(ext.extra_src_files or []),
|
|
50
|
+
],
|
|
51
|
+
include_dirs=[
|
|
52
|
+
os.path.dirname(ext.src_file),
|
|
53
|
+
*(ext.include_dirs or []),
|
|
54
|
+
],
|
|
20
55
|
extra_compile_args=[
|
|
21
|
-
*(['-std=
|
|
56
|
+
*([f'-std={CPP_STD}'] if any(ext.src_file.endswith(sf) for sf in ('cc', 'cpp')) else []),
|
|
57
|
+
*(ext.compile_args or []),
|
|
58
|
+
],
|
|
59
|
+
extra_link_args=[
|
|
60
|
+
*extra_link_args,
|
|
61
|
+
*(ext.link_args or []),
|
|
22
62
|
],
|
|
23
|
-
|
|
24
|
-
undef_macros=
|
|
63
|
+
define_macros=(list(ext.define_macros) if ext.define_macros is not None else None),
|
|
64
|
+
undef_macros=(list(ext.undef_macros) if ext.undef_macros is not None else None),
|
|
25
65
|
)
|
|
26
66
|
|
|
27
67
|
cmd_obj = du.BuildExt(du.BuildExt.Options(
|
|
28
|
-
inplace=
|
|
29
|
-
debug=
|
|
68
|
+
inplace=ext.inplace,
|
|
69
|
+
debug=ext.debug,
|
|
70
|
+
force=ext.force,
|
|
71
|
+
|
|
72
|
+
dry_run=ext.dry_run,
|
|
73
|
+
verbose=ext.verbose,
|
|
30
74
|
))
|
|
31
|
-
cmd_obj.build_extension(
|
|
75
|
+
cmd_obj.build_extension(du_ext)
|
|
32
76
|
|
|
33
|
-
|
|
34
|
-
os.path.dirname(
|
|
77
|
+
so_file = os.path.join(
|
|
78
|
+
os.path.dirname(ext.src_file),
|
|
35
79
|
''.join([
|
|
36
|
-
|
|
80
|
+
ext.full_name.rpartition('.')[2],
|
|
37
81
|
'.',
|
|
38
82
|
sysconfig.get_config_var('SOABI'),
|
|
39
83
|
sysconfig.get_config_var('SHLIB_SUFFIX'),
|
|
40
84
|
]),
|
|
41
85
|
)
|
|
42
86
|
|
|
43
|
-
return
|
|
87
|
+
return so_file
|
omdev/cexts/importhook.py
CHANGED
|
@@ -42,7 +42,7 @@ class CextImportLoader(importlib.machinery.ExtensionFileLoader):
|
|
|
42
42
|
super().__init__(module_name, filename)
|
|
43
43
|
|
|
44
44
|
def create_module(self, spec: importlib.machinery.ModuleSpec) -> types.ModuleType:
|
|
45
|
-
so_path = build.build_ext(spec.name, check.non_empty_str(spec.origin))
|
|
45
|
+
so_path = build.build_ext(build.BuildExt(spec.name, check.non_empty_str(spec.origin)))
|
|
46
46
|
self.path = so_path # noqa
|
|
47
47
|
spec.origin = so_path
|
|
48
48
|
return super().create_module(spec)
|
omdev/findmagic.py
CHANGED
|
@@ -17,6 +17,13 @@ def find_magic(
|
|
|
17
17
|
*,
|
|
18
18
|
py: bool = False,
|
|
19
19
|
) -> ta.Iterator[str]:
|
|
20
|
+
if isinstance(roots, str):
|
|
21
|
+
raise TypeError(roots)
|
|
22
|
+
if isinstance(magics, str):
|
|
23
|
+
raise TypeError(magics)
|
|
24
|
+
if isinstance(exts, str):
|
|
25
|
+
raise TypeError(exts)
|
|
26
|
+
|
|
20
27
|
if not magics:
|
|
21
28
|
raise Exception('Must specify magics')
|
|
22
29
|
if not exts:
|
omdev/manifests.py
ADDED
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
"""
|
|
2
|
+
!!! manifests! get-manifest, _manifest.py
|
|
3
|
+
- dumb dicts, root keys are 'types'
|
|
4
|
+
- get put in _manifest.py, root level dict or smth
|
|
5
|
+
- IMPORT files w comment
|
|
6
|
+
- comment must immediately precede a global val setter
|
|
7
|
+
- val is grabbed from imported module dict by name
|
|
8
|
+
- value is repr'd somehow (roundtrip checked) (naw, json lol)
|
|
9
|
+
- dumped in _manifest.py
|
|
10
|
+
- # @omlish-manifest \n _CACHE_MANIFEST = {'cache': {'name': 'llm', …
|
|
11
|
+
- also can do prechecks!
|
|
12
|
+
"""
|
|
13
|
+
# ruff: noqa: UP006
|
|
14
|
+
# @omlish-lite
|
|
15
|
+
import argparse
|
|
16
|
+
import collections
|
|
17
|
+
import dataclasses as dc
|
|
18
|
+
import inspect
|
|
19
|
+
import json
|
|
20
|
+
import os.path
|
|
21
|
+
import re
|
|
22
|
+
import shlex
|
|
23
|
+
import subprocess
|
|
24
|
+
import sys
|
|
25
|
+
import typing as ta
|
|
26
|
+
|
|
27
|
+
from omlish.lite.cached import cached_nullary
|
|
28
|
+
from omlish.lite.json import json_dumps_pretty
|
|
29
|
+
|
|
30
|
+
from . import findmagic
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
##
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@dc.dataclass(frozen=True)
|
|
37
|
+
class ManifestOrigin:
|
|
38
|
+
module: str
|
|
39
|
+
attr: str
|
|
40
|
+
|
|
41
|
+
file: str
|
|
42
|
+
line: int
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@dc.dataclass(frozen=True)
|
|
46
|
+
class Manifest(ManifestOrigin):
|
|
47
|
+
value: ta.Any
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
MANIFEST_MAGIC = '# @omlish-manifest'
|
|
51
|
+
|
|
52
|
+
_MANIFEST_GLOBAL_PAT = re.compile(r'^(?P<name>[A-Za-z_][A-Za-z0-9_]*)\s*=.*')
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _dump_module_manifests(spec: str, *attrs: str) -> None:
|
|
56
|
+
import importlib
|
|
57
|
+
import json
|
|
58
|
+
|
|
59
|
+
mod = importlib.import_module(spec)
|
|
60
|
+
|
|
61
|
+
out = {}
|
|
62
|
+
for attr in attrs:
|
|
63
|
+
manifest = getattr(mod, attr)
|
|
64
|
+
|
|
65
|
+
manifest_json = json.dumps(manifest)
|
|
66
|
+
rt_manifest = json.loads(manifest_json)
|
|
67
|
+
|
|
68
|
+
if rt_manifest != manifest:
|
|
69
|
+
raise Exception(f'Manifest failed to roundtrip: {manifest} != {rt_manifest}')
|
|
70
|
+
|
|
71
|
+
out[attr] = rt_manifest
|
|
72
|
+
|
|
73
|
+
out_json = json.dumps(out, indent=None, separators=(',', ':'))
|
|
74
|
+
print(out_json)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
@cached_nullary
|
|
78
|
+
def _payload_src() -> str:
|
|
79
|
+
return inspect.getsource(_dump_module_manifests)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def build_module_manifests(
|
|
83
|
+
file: str,
|
|
84
|
+
base: str,
|
|
85
|
+
*,
|
|
86
|
+
shell_wrap: bool = True,
|
|
87
|
+
) -> ta.Sequence[Manifest]:
|
|
88
|
+
print((file, base))
|
|
89
|
+
|
|
90
|
+
if not file.endswith('.py'):
|
|
91
|
+
raise Exception(file)
|
|
92
|
+
|
|
93
|
+
mod_name = file.rpartition('.')[0].replace(os.sep, '.')
|
|
94
|
+
|
|
95
|
+
with open(os.path.join(base, file)) as f:
|
|
96
|
+
src = f.read()
|
|
97
|
+
|
|
98
|
+
origins: ta.List[ManifestOrigin] = []
|
|
99
|
+
lines = src.splitlines(keepends=True)
|
|
100
|
+
for i, l in enumerate(lines):
|
|
101
|
+
if l.startswith(MANIFEST_MAGIC):
|
|
102
|
+
if (m := _MANIFEST_GLOBAL_PAT.match(nl := lines[i + 1])) is None:
|
|
103
|
+
raise Exception(nl)
|
|
104
|
+
|
|
105
|
+
origins.append(ManifestOrigin(
|
|
106
|
+
module=mod_name,
|
|
107
|
+
attr=m.groupdict()['name'],
|
|
108
|
+
|
|
109
|
+
file=file,
|
|
110
|
+
line=i + 1,
|
|
111
|
+
))
|
|
112
|
+
|
|
113
|
+
if not origins:
|
|
114
|
+
raise Exception('no manifests found')
|
|
115
|
+
|
|
116
|
+
if (dups := [k for k, v in collections.Counter(o.attr for o in origins).items() if v > 1]):
|
|
117
|
+
raise Exception(f'Duplicate attrs: {dups}')
|
|
118
|
+
|
|
119
|
+
attrs = [o.attr for o in origins]
|
|
120
|
+
|
|
121
|
+
subproc_src = '\n\n'.join([
|
|
122
|
+
_payload_src(),
|
|
123
|
+
f'_dump_module_manifests({mod_name!r}, {", ".join(repr(a) for a in attrs)})\n',
|
|
124
|
+
])
|
|
125
|
+
|
|
126
|
+
args = [
|
|
127
|
+
sys.executable,
|
|
128
|
+
'-c',
|
|
129
|
+
subproc_src,
|
|
130
|
+
]
|
|
131
|
+
|
|
132
|
+
if shell_wrap:
|
|
133
|
+
args = ['sh', '-c', ' '.join(map(shlex.quote, args))]
|
|
134
|
+
|
|
135
|
+
subproc_out = subprocess.check_output(args)
|
|
136
|
+
|
|
137
|
+
sp_lines = subproc_out.decode().strip().splitlines()
|
|
138
|
+
if len(sp_lines) != 1:
|
|
139
|
+
raise Exception('Unexpected subprocess output')
|
|
140
|
+
|
|
141
|
+
dct = json.loads(sp_lines[0])
|
|
142
|
+
if set(dct) != set(attrs):
|
|
143
|
+
raise Exception('Unexpected subprocess output keys')
|
|
144
|
+
|
|
145
|
+
out: ta.List[Manifest] = []
|
|
146
|
+
|
|
147
|
+
for o in origins:
|
|
148
|
+
manifest = dct[o.attr]
|
|
149
|
+
|
|
150
|
+
out.append(Manifest(
|
|
151
|
+
**dc.asdict(o),
|
|
152
|
+
value=manifest,
|
|
153
|
+
))
|
|
154
|
+
|
|
155
|
+
return out
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def build_package_manifests(
|
|
159
|
+
name: str,
|
|
160
|
+
base: str,
|
|
161
|
+
*,
|
|
162
|
+
write: bool = False,
|
|
163
|
+
) -> ta.List[Manifest]:
|
|
164
|
+
pkg_dir = os.path.join(base, name)
|
|
165
|
+
if not os.path.isdir(pkg_dir) or not os.path.isfile(os.path.join(pkg_dir, '__init__.py')):
|
|
166
|
+
raise Exception(pkg_dir)
|
|
167
|
+
|
|
168
|
+
manifests: ta.List[Manifest] = []
|
|
169
|
+
|
|
170
|
+
for file in findmagic.find_magic(
|
|
171
|
+
[pkg_dir],
|
|
172
|
+
[MANIFEST_MAGIC],
|
|
173
|
+
['py'],
|
|
174
|
+
):
|
|
175
|
+
manifests.extend(build_module_manifests(os.path.relpath(file, base), base))
|
|
176
|
+
|
|
177
|
+
if write:
|
|
178
|
+
with open(os.path.join(pkg_dir, '_manifests.json'), 'w') as f:
|
|
179
|
+
f.write(json_dumps_pretty([dc.asdict(m) for m in manifests]))
|
|
180
|
+
f.write('\n')
|
|
181
|
+
|
|
182
|
+
return manifests
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
##
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
if __name__ == '__main__':
|
|
189
|
+
def _gen_cmd(args) -> None:
|
|
190
|
+
if args.base is not None:
|
|
191
|
+
base = args.base
|
|
192
|
+
else:
|
|
193
|
+
base = os.getcwd()
|
|
194
|
+
base = os.path.abspath(base)
|
|
195
|
+
if not os.path.isdir(base):
|
|
196
|
+
raise RuntimeError(base)
|
|
197
|
+
|
|
198
|
+
for pkg in args.package:
|
|
199
|
+
ms = build_package_manifests(
|
|
200
|
+
pkg,
|
|
201
|
+
base,
|
|
202
|
+
write=args.write or False,
|
|
203
|
+
)
|
|
204
|
+
if not args.quiet:
|
|
205
|
+
print(json_dumps_pretty(ms))
|
|
206
|
+
|
|
207
|
+
def _main(argv=None) -> None:
|
|
208
|
+
parser = argparse.ArgumentParser()
|
|
209
|
+
subparsers = parser.add_subparsers()
|
|
210
|
+
|
|
211
|
+
parser_gen = subparsers.add_parser('gen')
|
|
212
|
+
parser_gen.add_argument('-b', '--base')
|
|
213
|
+
parser_gen.add_argument('-w', '--write', action='store_true')
|
|
214
|
+
parser_gen.add_argument('-q', '--quiet', action='store_true')
|
|
215
|
+
parser_gen.add_argument('package', nargs='*')
|
|
216
|
+
|
|
217
|
+
parser_gen.set_defaults(func=_gen_cmd)
|
|
218
|
+
|
|
219
|
+
args = parser.parse_args(argv)
|
|
220
|
+
if not getattr(args, 'func', None):
|
|
221
|
+
parser.print_help()
|
|
222
|
+
else:
|
|
223
|
+
args.func(args)
|
|
224
|
+
|
|
225
|
+
_main()
|
omdev/pyproject/pkg.py
CHANGED
|
@@ -255,6 +255,7 @@ class PyprojectPackageGenerator(BasePyprojectPackageGenerator):
|
|
|
255
255
|
st.pop('cexts', None)
|
|
256
256
|
|
|
257
257
|
self._move_dict_key(st, 'find_packages', pyp_dct, 'tool.setuptools.packages.find')
|
|
258
|
+
self._move_dict_key(st, 'package_data', pyp_dct, 'tool.setuptools.package-data')
|
|
258
259
|
|
|
259
260
|
mani_in = st.pop('manifest_in', None)
|
|
260
261
|
|
|
@@ -337,9 +338,14 @@ class _PyprojectCextPackageGenerator(BasePyprojectPackageGenerator):
|
|
|
337
338
|
st = specs.setuptools
|
|
338
339
|
pyp_dct['tool.setuptools'] = st
|
|
339
340
|
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
341
|
+
for k in [
|
|
342
|
+
'cexts',
|
|
343
|
+
|
|
344
|
+
'find_packages',
|
|
345
|
+
'package_data',
|
|
346
|
+
'manifest_in',
|
|
347
|
+
]:
|
|
348
|
+
st.pop(k, None)
|
|
343
349
|
|
|
344
350
|
pyp_dct['tool.setuptools.packages.find'] = {
|
|
345
351
|
'include': [],
|
omdev/scripts/pyproject.py
CHANGED
|
@@ -115,6 +115,13 @@ def find_magic(
|
|
|
115
115
|
*,
|
|
116
116
|
py: bool = False,
|
|
117
117
|
) -> ta.Iterator[str]:
|
|
118
|
+
if isinstance(roots, str):
|
|
119
|
+
raise TypeError(roots)
|
|
120
|
+
if isinstance(magics, str):
|
|
121
|
+
raise TypeError(magics)
|
|
122
|
+
if isinstance(exts, str):
|
|
123
|
+
raise TypeError(exts)
|
|
124
|
+
|
|
118
125
|
if not magics:
|
|
119
126
|
raise Exception('Must specify magics')
|
|
120
127
|
if not exts:
|
|
@@ -3836,6 +3843,7 @@ class PyprojectPackageGenerator(BasePyprojectPackageGenerator):
|
|
|
3836
3843
|
st.pop('cexts', None)
|
|
3837
3844
|
|
|
3838
3845
|
self._move_dict_key(st, 'find_packages', pyp_dct, 'tool.setuptools.packages.find')
|
|
3846
|
+
self._move_dict_key(st, 'package_data', pyp_dct, 'tool.setuptools.package-data')
|
|
3839
3847
|
|
|
3840
3848
|
mani_in = st.pop('manifest_in', None)
|
|
3841
3849
|
|
|
@@ -3918,9 +3926,14 @@ class _PyprojectCextPackageGenerator(BasePyprojectPackageGenerator):
|
|
|
3918
3926
|
st = specs.setuptools
|
|
3919
3927
|
pyp_dct['tool.setuptools'] = st
|
|
3920
3928
|
|
|
3921
|
-
|
|
3922
|
-
|
|
3923
|
-
|
|
3929
|
+
for k in [
|
|
3930
|
+
'cexts',
|
|
3931
|
+
|
|
3932
|
+
'find_packages',
|
|
3933
|
+
'package_data',
|
|
3934
|
+
'manifest_in',
|
|
3935
|
+
]:
|
|
3936
|
+
st.pop(k, None)
|
|
3924
3937
|
|
|
3925
3938
|
pyp_dct['tool.setuptools.packages.find'] = {
|
|
3926
3939
|
'include': [],
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: omdev
|
|
3
|
-
Version: 0.0.0.
|
|
3
|
+
Version: 0.0.0.dev25
|
|
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.dev25
|
|
16
16
|
Provides-Extra: all
|
|
17
17
|
Requires-Dist: pycparser ~=2.22 ; extra == 'all'
|
|
18
18
|
Requires-Dist: cffi ~=1.17 ; extra == 'all'
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
omdev/__about__.py,sha256=788lo_UuOSYF74y1RBiNlWkDdPnRFcmBAV5qYkaFJzE,868
|
|
2
2
|
omdev/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
|
+
omdev/_manifests.json,sha256=N1F-Xz3GaBn2H1p7uKzhkhKCQV8QVR0t76XD6wmFtXA,3
|
|
3
4
|
omdev/bracepy.py,sha256=HwBK5XmlOsF_juTel25fRLJK9vHSJCWXuCc-OZlevRQ,2619
|
|
4
5
|
omdev/classdot.py,sha256=urN5Pzd2ooAwnfkH0z-muQxdO90IMo-sX2WB-A37lVU,1533
|
|
5
6
|
omdev/cmake.py,sha256=Diy2ry65806dQP125DAstD3w46z_wszMH7PwC2-6iik,4578
|
|
6
7
|
omdev/findimports.py,sha256=P8v4I1tm6g-PEWJiNwAKxErvWwL-Nop83vAuwq1kR5A,2246
|
|
7
|
-
omdev/findmagic.py,sha256=
|
|
8
|
+
omdev/findmagic.py,sha256=DhBYHHP_dzwM5pIh21xnQPnkZ2YmAXCjithsr7X0ScU,2357
|
|
9
|
+
omdev/manifests.py,sha256=UKSI0bvfrWV_Owt9KmsqOr35m11yFlM95ECczwwA6I8,5593
|
|
8
10
|
omdev/revisions.py,sha256=kYrYoxmUkpwgbmLEijHu5bwjyOxggCt8N6bnWFwA-60,5392
|
|
9
11
|
omdev/tokens.py,sha256=GusxQ1Cd_eiScuR8XTTtc9QFhOgYviYGBZmFnn3Hj7s,756
|
|
10
12
|
omdev/wheelfile.py,sha256=yfupGcGkbFlmzGzKU64k_vmOKpaKnUlDWxeGn2KdekU,10005
|
|
@@ -12,11 +14,13 @@ omdev/amalg/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
12
14
|
omdev/amalg/__main__.py,sha256=OE1udULO1g4McUbeg1CoHbSm4hbQ2kcE3ffEGxlnPh4,69
|
|
13
15
|
omdev/amalg/amalg.py,sha256=YEyH097MZop-f1qobZJW__srtyLFS3rI7M2MaRtshKg,13057
|
|
14
16
|
omdev/cexts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
15
|
-
omdev/cexts/
|
|
17
|
+
omdev/cexts/_boilerplate.cc,sha256=aOWF_5C2pqnIrkT1ykEaL7N2pIpamW6pdXriRbd3lvs,1725
|
|
18
|
+
omdev/cexts/build.py,sha256=F3z1-CjDlEM-Gzi5IunKUBO52qdH_pMsFylobTdGJnI,2654
|
|
16
19
|
omdev/cexts/cmake.py,sha256=WiGcxmsI9dGQ5rM5ByMtHdG_MBP1dhj3gkbwUWY9rm8,9741
|
|
17
|
-
omdev/cexts/importhook.py,sha256=
|
|
20
|
+
omdev/cexts/importhook.py,sha256=ko0KRxah_ZHhLVcCigYIIDvNHCfHpJ8qhmmuHKbCOt4,3546
|
|
18
21
|
omdev/cexts/magic.py,sha256=LhC31I2GiCq3NRU5dpy_9do6IVjhdGu58uPPFffQx5Q,135
|
|
19
22
|
omdev/cexts/scan.py,sha256=_U5DX9ksHP1845PdGxWh4Rf1a6x_sG1MH3uL_hwBnKY,1669
|
|
23
|
+
omdev/cexts/_distutils/LICENSE,sha256=22p14FIRp3F4Cb7Mj_GK33PKr25issFGHC2JN6dg9vc,1023
|
|
20
24
|
omdev/cexts/_distutils/__init__.py,sha256=c1zImtnPh3uY8BUTV4RLKtGKqTPx3c_pBbhA6tPtNsE,297
|
|
21
25
|
omdev/cexts/_distutils/build_ext.py,sha256=STHl9Rq2KeWJ3dQ8j8LwIQ-vFc4-3XsYWQ8Qc5_VByU,13833
|
|
22
26
|
omdev/cexts/_distutils/dir_util.py,sha256=xxfAIPHbjlh-aW9OX6UGDrXiXfB5biG4xEC5RA6oszM,2882
|
|
@@ -52,13 +56,13 @@ omdev/pyproject/__main__.py,sha256=gFhR9DikwDZk0LqgdR3qq_aXQHThUOPllDmHDOfnFAU,6
|
|
|
52
56
|
omdev/pyproject/cexts.py,sha256=x13piOOnNrYbA17qZLDVuR0p1sqhgEwpk4FtImX-klM,4281
|
|
53
57
|
omdev/pyproject/cli.py,sha256=qBVsQDcNSCC3i78X9jFlPZ3ahDSY-0OD0UN1mbqLgYE,10649
|
|
54
58
|
omdev/pyproject/configs.py,sha256=K9H5cGwVLgHi8wKwtYvlXHZ9ThtmnI4jo8JAb-t1-70,2859
|
|
55
|
-
omdev/pyproject/pkg.py,sha256=
|
|
59
|
+
omdev/pyproject/pkg.py,sha256=TrmRc8IRbfXuAvNKU76cNjX77UmmXpmuHYRws_r24J4,10005
|
|
56
60
|
omdev/pyproject/reqs.py,sha256=coq21cdWQIPs06-iuRnwc6F2Sf-IxpqoT6DEMhol2kA,2298
|
|
57
61
|
omdev/scripts/__init__.py,sha256=MKCvUAEQwsIvwLixwtPlpBqmkMXLCnjjXyAXvVpDwVk,91
|
|
58
62
|
omdev/scripts/bumpversion.py,sha256=Kn7fo73Hs8uJh3Hi3EIyLOlzLPWAC6dwuD_lZ3cIzuY,1064
|
|
59
63
|
omdev/scripts/execrss.py,sha256=HzDNmwXOO8fMwIRXw9q8CUnVfLFCQASyU2tfY_y2Vf8,324
|
|
60
64
|
omdev/scripts/interp.py,sha256=gMFw-FbHvMO706wrLbOBY-kZlB3fNYJXMTwJlyVIQQc,68506
|
|
61
|
-
omdev/scripts/pyproject.py,sha256=
|
|
65
|
+
omdev/scripts/pyproject.py,sha256=KzwB_HDv_F5htqHzW7559484mws2PQ-Yy19YUWb5W7A,148384
|
|
62
66
|
omdev/toml/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
|
|
63
67
|
omdev/toml/parser.py,sha256=84bn09uhYHwQGyfww6Rw6y1RxPAE_HDltODOSakcqDM,29186
|
|
64
68
|
omdev/toml/writer.py,sha256=dwz_Qw8z5Z_nmWpXqch63W6S_j6n256erb7AGFTVzB4,2872
|
|
@@ -72,8 +76,8 @@ omdev/tools/sqlrepl.py,sha256=v9uVQ4nvquSXcQVYIFq34ikumSILvKqzD6lUKLcncCE,5646
|
|
|
72
76
|
omdev/versioning/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
|
|
73
77
|
omdev/versioning/specifiers.py,sha256=6Odf9e6farwlPRsD_YqwTfYKG-BXn_dIcKtqfkhfodI,17432
|
|
74
78
|
omdev/versioning/versions.py,sha256=ei2eopEsJq3zSMJmezK1nzZgikgCdxFtnF3f69nCRZQ,12246
|
|
75
|
-
omdev-0.0.0.
|
|
76
|
-
omdev-0.0.0.
|
|
77
|
-
omdev-0.0.0.
|
|
78
|
-
omdev-0.0.0.
|
|
79
|
-
omdev-0.0.0.
|
|
79
|
+
omdev-0.0.0.dev25.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
|
|
80
|
+
omdev-0.0.0.dev25.dist-info/METADATA,sha256=g5GSFpeISENZkoNn3wYHGZgLKE-NMaCrYzpjYUaDP1Y,1252
|
|
81
|
+
omdev-0.0.0.dev25.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
|
|
82
|
+
omdev-0.0.0.dev25.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
|
|
83
|
+
omdev-0.0.0.dev25.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|