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 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
- def build_ext(
9
- fullname: str,
10
- src_path: str,
11
- ) -> str:
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
- ext = du.Extension(
17
- fullname,
18
- sources=[src_path],
19
- include_dirs=[os.path.dirname(src_path)],
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=c++20'] if any(src_path.endswith(sf) for sf in ('cc', 'cpp')) else []),
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
- extra_link_args=extra_link_args,
24
- undef_macros=['BARF'],
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=True,
29
- debug=True,
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(ext)
75
+ cmd_obj.build_extension(du_ext)
32
76
 
33
- so_path = os.path.join(
34
- os.path.dirname(src_path),
77
+ so_file = os.path.join(
78
+ os.path.dirname(ext.src_file),
35
79
  ''.join([
36
- fullname.rpartition('.')[2],
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 so_path
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
- st.pop('cexts', None)
341
- st.pop('find_packages', None)
342
- st.pop('manifest_in', None)
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': [],
@@ -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
- st.pop('cexts', None)
3922
- st.pop('find_packages', None)
3923
- st.pop('manifest_in', None)
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.dev24
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.dev24
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=t8q1OoWVTFXTSDS36dr79ScTYLYk786Z9wFj8UObneQ,2170
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/build.py,sha256=zViF1wYx6z5ACyifgNjlCAVoPAMCKpTr_VoAvwtmvtY,1013
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=nljqEuPopuh10DPeSrIYKmkV4z-Wk5Q7WpUid1JEmkg,3530
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=1HcVUoTE_vdc5bAW3AUFcM-3BWI1ICoXEJlkTFIAmh4,9856
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=X0Aw7LWf1dDrh6cIbI_u7rapKYYPymscKyePPrcjbxY,148048
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.dev24.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
76
- omdev-0.0.0.dev24.dist-info/METADATA,sha256=aKMRukPrnmd7ZvW0-L-rvtXL4QpczmUX4yW3PegnvbA,1252
77
- omdev-0.0.0.dev24.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
78
- omdev-0.0.0.dev24.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
79
- omdev-0.0.0.dev24.dist-info/RECORD,,
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,,