omdev 0.0.0.dev51__py3-none-any.whl → 0.0.0.dev53__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/cli/main.py +25 -5
- omdev/cli/types.py +9 -1
- omdev/manifests/build.py +168 -123
- omdev/pyproject/cli.py +1 -1
- omdev/scripts/pyproject.py +1 -1
- omdev/secrets.py +8 -3
- {omdev-0.0.0.dev51.dist-info → omdev-0.0.0.dev53.dist-info}/METADATA +2 -2
- {omdev-0.0.0.dev51.dist-info → omdev-0.0.0.dev53.dist-info}/RECORD +12 -12
- {omdev-0.0.0.dev51.dist-info → omdev-0.0.0.dev53.dist-info}/LICENSE +0 -0
- {omdev-0.0.0.dev51.dist-info → omdev-0.0.0.dev53.dist-info}/WHEEL +0 -0
- {omdev-0.0.0.dev51.dist-info → omdev-0.0.0.dev53.dist-info}/entry_points.txt +0 -0
- {omdev-0.0.0.dev51.dist-info → omdev-0.0.0.dev53.dist-info}/top_level.txt +0 -0
omdev/cli/main.py
CHANGED
|
@@ -64,9 +64,10 @@ def _main() -> None:
|
|
|
64
64
|
|
|
65
65
|
dct: dict[str, CliCmd] = {}
|
|
66
66
|
for cc in ccs:
|
|
67
|
-
if cc.cmd_name
|
|
68
|
-
|
|
69
|
-
|
|
67
|
+
for cn in [cc.cmd_name] if isinstance(cc.cmd_name, str) else cc.cmd_name:
|
|
68
|
+
if cn in dct:
|
|
69
|
+
raise NameError(cc)
|
|
70
|
+
dct[cn] = cc
|
|
70
71
|
|
|
71
72
|
#
|
|
72
73
|
|
|
@@ -76,7 +77,26 @@ def _main() -> None:
|
|
|
76
77
|
|
|
77
78
|
args = parser.parse_args()
|
|
78
79
|
if not args.cmd:
|
|
79
|
-
|
|
80
|
+
mdct: dict = {}
|
|
81
|
+
for cc in ccs:
|
|
82
|
+
if isinstance(cc.cmd_name, str) and cc.cmd_name[0] == '_':
|
|
83
|
+
continue
|
|
84
|
+
if isinstance(cc, CliFunc):
|
|
85
|
+
mdct.setdefault('-', []).append(cc)
|
|
86
|
+
elif isinstance(cc, CliModule):
|
|
87
|
+
mdct.setdefault(cc.mod_name.partition('.')[0], []).append(cc)
|
|
88
|
+
else:
|
|
89
|
+
raise TypeError(cc)
|
|
90
|
+
|
|
91
|
+
print('Subcommands:\n')
|
|
92
|
+
for m, l in sorted(mdct.items(), key=lambda t: (t[0] == '-', t[0])):
|
|
93
|
+
print(f' {m}')
|
|
94
|
+
for cc in sorted(l, key=lambda c: c.primary_name):
|
|
95
|
+
if isinstance(cc.cmd_name, str):
|
|
96
|
+
print(f' {cc.cmd_name}')
|
|
97
|
+
else:
|
|
98
|
+
print(f' {cc.cmd_name[0]} ({", ".join(cc.cmd_name[1:])})')
|
|
99
|
+
print()
|
|
80
100
|
return
|
|
81
101
|
|
|
82
102
|
#
|
|
@@ -84,7 +104,7 @@ def _main() -> None:
|
|
|
84
104
|
cc = dct[args.cmd]
|
|
85
105
|
|
|
86
106
|
if isinstance(cc, CliModule):
|
|
87
|
-
sys.argv = [
|
|
107
|
+
sys.argv = [args.cmd, *(args.args or ())]
|
|
88
108
|
runpy._run_module_as_main(cc.mod_name) # type: ignore # noqa
|
|
89
109
|
|
|
90
110
|
elif isinstance(cc, CliFunc):
|
omdev/cli/types.py
CHANGED
|
@@ -1,10 +1,18 @@
|
|
|
1
|
+
# ruff: noqa: UP007
|
|
1
2
|
import dataclasses as dc
|
|
2
3
|
import typing as ta
|
|
3
4
|
|
|
4
5
|
|
|
5
6
|
@dc.dataclass(frozen=True)
|
|
6
7
|
class CliCmd:
|
|
7
|
-
cmd_name: str
|
|
8
|
+
cmd_name: ta.Union[str, ta.Sequence[str]]
|
|
9
|
+
|
|
10
|
+
@property
|
|
11
|
+
def primary_name(self) -> str:
|
|
12
|
+
if isinstance(self.cmd_name, str):
|
|
13
|
+
return self.cmd_name
|
|
14
|
+
else:
|
|
15
|
+
return self.cmd_name[0]
|
|
8
16
|
|
|
9
17
|
|
|
10
18
|
@dc.dataclass(frozen=True)
|
omdev/manifests/build.py
CHANGED
|
@@ -12,10 +12,13 @@ See (entry_points):
|
|
|
12
12
|
"""
|
|
13
13
|
# ruff: noqa: UP006 UP007
|
|
14
14
|
import argparse
|
|
15
|
+
import asyncio
|
|
15
16
|
import collections
|
|
16
17
|
import dataclasses as dc
|
|
17
18
|
import inspect
|
|
19
|
+
import itertools
|
|
18
20
|
import json
|
|
21
|
+
import multiprocessing as mp
|
|
19
22
|
import os.path
|
|
20
23
|
import re
|
|
21
24
|
import shlex
|
|
@@ -35,6 +38,9 @@ from .types import Manifest
|
|
|
35
38
|
from .types import ManifestOrigin
|
|
36
39
|
|
|
37
40
|
|
|
41
|
+
T = ta.TypeVar('T')
|
|
42
|
+
|
|
43
|
+
|
|
38
44
|
##
|
|
39
45
|
|
|
40
46
|
|
|
@@ -94,131 +100,160 @@ def _payload_src() -> str:
|
|
|
94
100
|
return inspect.getsource(_dump_module_manifests)
|
|
95
101
|
|
|
96
102
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
103
|
+
class ManifestBuilder:
|
|
104
|
+
def __init__(
|
|
105
|
+
self,
|
|
106
|
+
base: str,
|
|
107
|
+
concurrency: int = 8,
|
|
108
|
+
*,
|
|
109
|
+
write: bool = False,
|
|
110
|
+
) -> None:
|
|
111
|
+
super().__init__()
|
|
112
|
+
|
|
113
|
+
self._base = base
|
|
114
|
+
self._sem = asyncio.Semaphore(concurrency)
|
|
115
|
+
self._write = write
|
|
116
|
+
|
|
117
|
+
async def _spawn(self, fn: ta.Callable[..., ta.Awaitable[T]], *args: ta.Any, **kwargs: ta.Any) -> T:
|
|
118
|
+
await self._sem.acquire()
|
|
119
|
+
try:
|
|
120
|
+
try:
|
|
121
|
+
return await fn(*args, **kwargs)
|
|
122
|
+
except Exception: # noqa
|
|
123
|
+
log.exception('Exception in task: %s, %r, %r', fn, args, kwargs)
|
|
124
|
+
raise
|
|
125
|
+
finally:
|
|
126
|
+
self._sem.release()
|
|
127
|
+
|
|
128
|
+
async def build_module_manifests(
|
|
129
|
+
self,
|
|
130
|
+
file: str,
|
|
131
|
+
*,
|
|
132
|
+
shell_wrap: bool = True,
|
|
133
|
+
warn_threshold_s: ta.Optional[float] = 1.,
|
|
134
|
+
) -> ta.Sequence[Manifest]:
|
|
135
|
+
log.info('Extracting manifests from file %s', file)
|
|
136
|
+
|
|
137
|
+
if not file.endswith('.py'):
|
|
138
|
+
raise Exception(file)
|
|
139
|
+
|
|
140
|
+
mod_name = file.rpartition('.')[0].replace(os.sep, '.')
|
|
141
|
+
mod_base = mod_name.split('.')[0]
|
|
142
|
+
if mod_base != (first_dir := file.split(os.path.sep)[0]):
|
|
143
|
+
raise Exception(f'Unexpected module base: {mod_base=} != {first_dir=}')
|
|
144
|
+
|
|
145
|
+
with open(os.path.join(self._base, file)) as f: # noqa
|
|
146
|
+
src = f.read()
|
|
147
|
+
|
|
148
|
+
origins: ta.List[ManifestOrigin] = []
|
|
149
|
+
lines = src.splitlines(keepends=True)
|
|
150
|
+
for i, l in enumerate(lines):
|
|
151
|
+
if l.startswith(MANIFEST_MAGIC):
|
|
152
|
+
if (m := _MANIFEST_GLOBAL_PAT.match(nl := lines[i + 1])) is None:
|
|
153
|
+
raise Exception(nl)
|
|
154
|
+
|
|
155
|
+
origins.append(ManifestOrigin(
|
|
156
|
+
module='.'.join(['', *mod_name.split('.')[1:]]),
|
|
157
|
+
attr=m.groupdict()['name'],
|
|
158
|
+
|
|
159
|
+
file=file,
|
|
160
|
+
line=i + 1,
|
|
161
|
+
))
|
|
162
|
+
|
|
163
|
+
if not origins:
|
|
164
|
+
raise Exception('no manifests found')
|
|
165
|
+
|
|
166
|
+
if (dups := [k for k, v in collections.Counter(o.attr for o in origins).items() if v > 1]):
|
|
167
|
+
raise Exception(f'Duplicate attrs: {dups}')
|
|
168
|
+
|
|
169
|
+
attrs = [o.attr for o in origins]
|
|
170
|
+
|
|
171
|
+
subproc_src = '\n\n'.join([
|
|
172
|
+
_payload_src(),
|
|
173
|
+
f'_dump_module_manifests({mod_name!r}, {", ".join(repr(a) for a in attrs)})\n',
|
|
174
|
+
])
|
|
175
|
+
|
|
176
|
+
args = [
|
|
177
|
+
sys.executable,
|
|
178
|
+
'-c',
|
|
179
|
+
subproc_src,
|
|
180
|
+
]
|
|
181
|
+
|
|
182
|
+
if shell_wrap:
|
|
183
|
+
args = ['sh', '-c', ' '.join(map(shlex.quote, args))]
|
|
184
|
+
|
|
185
|
+
start_time = time.time()
|
|
186
|
+
|
|
187
|
+
proc = await asyncio.create_subprocess_exec(*args, stdout=subprocess.PIPE)
|
|
188
|
+
subproc_out, _ = await proc.communicate()
|
|
189
|
+
if proc.returncode:
|
|
190
|
+
raise Exception('Subprocess failed')
|
|
191
|
+
|
|
192
|
+
end_time = time.time()
|
|
193
|
+
|
|
194
|
+
if warn_threshold_s is not None and (elapsed_time := (end_time - start_time)) >= warn_threshold_s:
|
|
195
|
+
log.warning('Manifest extraction took a long time: %s, %.2f s', file, elapsed_time)
|
|
196
|
+
|
|
197
|
+
sp_lines = subproc_out.decode().strip().splitlines()
|
|
198
|
+
if len(sp_lines) != 1:
|
|
199
|
+
raise Exception('Unexpected subprocess output')
|
|
200
|
+
|
|
201
|
+
dct = json.loads(sp_lines[0])
|
|
202
|
+
if set(dct) != set(attrs):
|
|
203
|
+
raise Exception('Unexpected subprocess output keys')
|
|
204
|
+
|
|
205
|
+
out: ta.List[Manifest] = []
|
|
206
|
+
|
|
207
|
+
for o in origins:
|
|
208
|
+
value = dct[o.attr]
|
|
209
|
+
|
|
210
|
+
if not (
|
|
211
|
+
isinstance(value, ta.Mapping) and
|
|
212
|
+
len(value) == 1 and
|
|
213
|
+
all(isinstance(k, str) and k.startswith('$') and len(k) > 1 for k in value)
|
|
214
|
+
):
|
|
215
|
+
raise TypeError(f'Manifests must be mappings of strings starting with $: {value!r}')
|
|
216
|
+
|
|
217
|
+
[(key, value_dct)] = value.items()
|
|
218
|
+
kb, _, kr = key[1:].partition('.') # noqa
|
|
219
|
+
if kb == mod_base: # noqa
|
|
220
|
+
key = f'$.{kr}'
|
|
221
|
+
value = {key: value_dct}
|
|
222
|
+
|
|
223
|
+
out.append(Manifest(
|
|
224
|
+
**dc.asdict(o),
|
|
225
|
+
value=value,
|
|
130
226
|
))
|
|
131
227
|
|
|
132
|
-
|
|
133
|
-
raise Exception('no manifests found')
|
|
134
|
-
|
|
135
|
-
if (dups := [k for k, v in collections.Counter(o.attr for o in origins).items() if v > 1]):
|
|
136
|
-
raise Exception(f'Duplicate attrs: {dups}')
|
|
137
|
-
|
|
138
|
-
attrs = [o.attr for o in origins]
|
|
139
|
-
|
|
140
|
-
subproc_src = '\n\n'.join([
|
|
141
|
-
_payload_src(),
|
|
142
|
-
f'_dump_module_manifests({mod_name!r}, {", ".join(repr(a) for a in attrs)})\n',
|
|
143
|
-
])
|
|
144
|
-
|
|
145
|
-
args = [
|
|
146
|
-
sys.executable,
|
|
147
|
-
'-c',
|
|
148
|
-
subproc_src,
|
|
149
|
-
]
|
|
150
|
-
|
|
151
|
-
if shell_wrap:
|
|
152
|
-
args = ['sh', '-c', ' '.join(map(shlex.quote, args))]
|
|
153
|
-
|
|
154
|
-
start_time = time.time()
|
|
155
|
-
|
|
156
|
-
subproc_out = subprocess.check_output(args)
|
|
157
|
-
|
|
158
|
-
end_time = time.time()
|
|
159
|
-
|
|
160
|
-
if warn_threshold_s is not None and (elapsed_time := (end_time - start_time)) >= warn_threshold_s:
|
|
161
|
-
log.warning('Manifest extraction took a long time: %s, %.2f s', file, elapsed_time)
|
|
162
|
-
|
|
163
|
-
sp_lines = subproc_out.decode().strip().splitlines()
|
|
164
|
-
if len(sp_lines) != 1:
|
|
165
|
-
raise Exception('Unexpected subprocess output')
|
|
166
|
-
|
|
167
|
-
dct = json.loads(sp_lines[0])
|
|
168
|
-
if set(dct) != set(attrs):
|
|
169
|
-
raise Exception('Unexpected subprocess output keys')
|
|
170
|
-
|
|
171
|
-
out: ta.List[Manifest] = []
|
|
172
|
-
|
|
173
|
-
for o in origins:
|
|
174
|
-
value = dct[o.attr]
|
|
175
|
-
|
|
176
|
-
if not (
|
|
177
|
-
isinstance(value, ta.Mapping) and
|
|
178
|
-
len(value) == 1 and
|
|
179
|
-
all(isinstance(k, str) and k.startswith('$') and len(k) > 1 for k in value)
|
|
180
|
-
):
|
|
181
|
-
raise TypeError(f'Manifests must be mappings of strings starting with $: {value!r}')
|
|
228
|
+
return out
|
|
182
229
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
230
|
+
async def build_package_manifests(
|
|
231
|
+
self,
|
|
232
|
+
name: str,
|
|
233
|
+
) -> ta.List[Manifest]:
|
|
234
|
+
pkg_dir = os.path.join(self._base, name)
|
|
235
|
+
if not os.path.isdir(pkg_dir) or not os.path.isfile(os.path.join(pkg_dir, '__init__.py')):
|
|
236
|
+
raise Exception(pkg_dir)
|
|
188
237
|
|
|
189
|
-
|
|
190
|
-
**dc.asdict(o),
|
|
191
|
-
value=value,
|
|
192
|
-
))
|
|
193
|
-
|
|
194
|
-
return out
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
def build_package_manifests(
|
|
198
|
-
name: str,
|
|
199
|
-
base: str,
|
|
200
|
-
*,
|
|
201
|
-
write: bool = False,
|
|
202
|
-
) -> ta.List[Manifest]:
|
|
203
|
-
pkg_dir = os.path.join(base, name)
|
|
204
|
-
if not os.path.isdir(pkg_dir) or not os.path.isfile(os.path.join(pkg_dir, '__init__.py')):
|
|
205
|
-
raise Exception(pkg_dir)
|
|
206
|
-
|
|
207
|
-
manifests: ta.List[Manifest] = []
|
|
208
|
-
|
|
209
|
-
for file in sorted(findmagic.find_magic(
|
|
238
|
+
files = sorted(findmagic.find_magic(
|
|
210
239
|
[pkg_dir],
|
|
211
240
|
[MANIFEST_MAGIC],
|
|
212
241
|
['py'],
|
|
213
|
-
|
|
214
|
-
manifests.
|
|
242
|
+
))
|
|
243
|
+
manifests: ta.List[Manifest] = list(itertools.chain.from_iterable(await asyncio.gather(*[
|
|
244
|
+
self._spawn(
|
|
245
|
+
self.build_module_manifests,
|
|
246
|
+
os.path.relpath(file, self._base),
|
|
247
|
+
)
|
|
248
|
+
for file in files
|
|
249
|
+
])))
|
|
215
250
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
251
|
+
if self._write:
|
|
252
|
+
with open(os.path.join(pkg_dir, '.manifests.json'), 'w') as f: # noqa
|
|
253
|
+
f.write(json_dumps_pretty([dc.asdict(m) for m in manifests]))
|
|
254
|
+
f.write('\n')
|
|
220
255
|
|
|
221
|
-
|
|
256
|
+
return manifests
|
|
222
257
|
|
|
223
258
|
|
|
224
259
|
##
|
|
@@ -266,13 +301,22 @@ if __name__ == '__main__':
|
|
|
266
301
|
def _gen_cmd(args) -> None:
|
|
267
302
|
base = _get_base(args)
|
|
268
303
|
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
304
|
+
jobs = args.jobs or int(max(mp.cpu_count() // 1.5, 1))
|
|
305
|
+
builder = ManifestBuilder(
|
|
306
|
+
base,
|
|
307
|
+
jobs,
|
|
308
|
+
write=args.write or False,
|
|
309
|
+
)
|
|
310
|
+
|
|
311
|
+
async def do():
|
|
312
|
+
return await asyncio.gather(*[
|
|
313
|
+
builder.build_package_manifests(pkg)
|
|
314
|
+
for pkg in args.package
|
|
315
|
+
])
|
|
316
|
+
|
|
317
|
+
mss = asyncio.run(do())
|
|
318
|
+
if not args.quiet:
|
|
319
|
+
for ms in mss:
|
|
276
320
|
print(json_dumps_pretty([dc.asdict(m) for m in ms]))
|
|
277
321
|
|
|
278
322
|
def _check_cmd(args) -> None:
|
|
@@ -294,6 +338,7 @@ if __name__ == '__main__':
|
|
|
294
338
|
parser_gen.add_argument('-b', '--base')
|
|
295
339
|
parser_gen.add_argument('-w', '--write', action='store_true')
|
|
296
340
|
parser_gen.add_argument('-q', '--quiet', action='store_true')
|
|
341
|
+
parser_gen.add_argument('-j', '--jobs', type=int)
|
|
297
342
|
parser_gen.add_argument('package', nargs='*')
|
|
298
343
|
parser_gen.set_defaults(func=_gen_cmd)
|
|
299
344
|
|
omdev/pyproject/cli.py
CHANGED
|
@@ -348,7 +348,7 @@ def _pkg_cmd(args) -> None:
|
|
|
348
348
|
]
|
|
349
349
|
pgs = list(itertools.chain.from_iterable([pg, *pg.children()] for pg in pgs))
|
|
350
350
|
|
|
351
|
-
num_threads = args.jobs or max(mp.cpu_count() //
|
|
351
|
+
num_threads = args.jobs or int(max(mp.cpu_count() // 1.5, 1))
|
|
352
352
|
futs: ta.List[cf.Future]
|
|
353
353
|
with cf.ThreadPoolExecutor(num_threads) as ex:
|
|
354
354
|
futs = [ex.submit(pg.gen) for pg in pgs]
|
omdev/scripts/pyproject.py
CHANGED
|
@@ -5287,7 +5287,7 @@ def _pkg_cmd(args) -> None:
|
|
|
5287
5287
|
]
|
|
5288
5288
|
pgs = list(itertools.chain.from_iterable([pg, *pg.children()] for pg in pgs))
|
|
5289
5289
|
|
|
5290
|
-
num_threads = args.jobs or max(mp.cpu_count() //
|
|
5290
|
+
num_threads = args.jobs or int(max(mp.cpu_count() // 1.5, 1))
|
|
5291
5291
|
futs: ta.List[cf.Future]
|
|
5292
5292
|
with cf.ThreadPoolExecutor(num_threads) as ex:
|
|
5293
5293
|
futs = [ex.submit(pg.gen) for pg in pgs]
|
omdev/secrets.py
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
import os.path
|
|
2
|
-
import typing as ta
|
|
3
2
|
|
|
4
3
|
import yaml
|
|
5
4
|
|
|
5
|
+
from omlish import secrets as sec
|
|
6
|
+
|
|
6
7
|
|
|
7
8
|
SECRETS_PATH = os.getenv('SECRETS_PATH', os.path.expanduser('~/Dropbox/.dotfiles/secrets.yml'))
|
|
8
9
|
|
|
9
10
|
|
|
10
|
-
def load_secrets() ->
|
|
11
|
+
def load_secrets() -> sec.Secrets:
|
|
12
|
+
dct: dict[str, sec.Secret] = {}
|
|
11
13
|
with open(SECRETS_PATH) as f:
|
|
12
|
-
|
|
14
|
+
for k, v in yaml.safe_load(f).items():
|
|
15
|
+
if isinstance(v, str):
|
|
16
|
+
dct[k] = sec.Secret(key=k, value=v)
|
|
17
|
+
return sec.MappingSecrets(dct)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: omdev
|
|
3
|
-
Version: 0.0.0.
|
|
3
|
+
Version: 0.0.0.dev53
|
|
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.dev53
|
|
16
16
|
Provides-Extra: all
|
|
17
17
|
Requires-Dist: pycparser ~=2.22 ; extra == 'all'
|
|
18
18
|
Requires-Dist: cffi ~=1.17 ; extra == 'all'
|
|
@@ -8,7 +8,7 @@ omdev/findimports.py,sha256=P8v4I1tm6g-PEWJiNwAKxErvWwL-Nop83vAuwq1kR5A,2246
|
|
|
8
8
|
omdev/findmagic.py,sha256=DhBYHHP_dzwM5pIh21xnQPnkZ2YmAXCjithsr7X0ScU,2357
|
|
9
9
|
omdev/git.py,sha256=riM2KqSpQPC3N89uipd7Vm3kVgv4EYYDBU9tV1Z8juM,2208
|
|
10
10
|
omdev/revisions.py,sha256=U657hf4zeEN32y3g4CzqCAodx_HlfkHj2cIIKALNFDo,5009
|
|
11
|
-
omdev/secrets.py,sha256=
|
|
11
|
+
omdev/secrets.py,sha256=Or0Dw-D1FY1uaZulcTWLmHCGI9bs8UWbyaPIJSSstQ4,437
|
|
12
12
|
omdev/tokens.py,sha256=GusxQ1Cd_eiScuR8XTTtc9QFhOgYviYGBZmFnn3Hj7s,756
|
|
13
13
|
omdev/wheelfile.py,sha256=yfupGcGkbFlmzGzKU64k_vmOKpaKnUlDWxeGn2KdekU,10005
|
|
14
14
|
omdev/amalg/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -57,9 +57,9 @@ omdev/cli/__init__.py,sha256=V_l6VP1SZMlJbO-8CJwSuO9TThOy2S_oaPepNYgIrbE,37
|
|
|
57
57
|
omdev/cli/__main__.py,sha256=5IeIERm-371fSI5ZvPv8eldAJBwgKwpR0R49pTsILNM,76
|
|
58
58
|
omdev/cli/clicli.py,sha256=rQ9-F9XI3BevnfIVALHVKrrHNQPdYhkQ-IKESTNB5RA,2447
|
|
59
59
|
omdev/cli/install.py,sha256=C-W171YlIHt4Cfok-nWSMbHwWhqF_PFqq2HixFttYx8,4460
|
|
60
|
-
omdev/cli/main.py,sha256=
|
|
60
|
+
omdev/cli/main.py,sha256=uyrpniI2nz84EV5-mFbcKJXf0sROJXSomEsangsRI_w,2751
|
|
61
61
|
omdev/cli/managers.py,sha256=zqhMgNnv2VbXoTP6SgZeSuWfAVo1Ge-HJnQ1ftL-Mq8,2590
|
|
62
|
-
omdev/cli/types.py,sha256=
|
|
62
|
+
omdev/cli/types.py,sha256=bqKw9SbtBtAip2vF9v4khh0CqKG6LBr6n9VzWBz7AJE,474
|
|
63
63
|
omdev/interp/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
|
|
64
64
|
omdev/interp/__main__.py,sha256=GMCqeGYltgt5dlJzHxY9gqisa8cRkrPfmZYuZnjg4WI,162
|
|
65
65
|
omdev/interp/cli.py,sha256=sh7PZQoLletUViw1Y9OXNr9ekyNZ6YyxYuOQ_n9hyqU,2072
|
|
@@ -71,7 +71,7 @@ omdev/interp/standalone.py,sha256=XcltiL7ypcfV89C82_3knQ3Kx7aW4wnnxf2056ZXC3A,77
|
|
|
71
71
|
omdev/interp/system.py,sha256=bI-JhX4GVJqW7wMxnIa-DGJWnCLmFcIsnl9pc1RGY2g,3513
|
|
72
72
|
omdev/interp/types.py,sha256=EMN3StEMkFoQAMUIZd7JYL4uUWqzFGY-2hTL8EBznYM,2437
|
|
73
73
|
omdev/manifests/__init__.py,sha256=P2B0dpT8D7l5lJwRGPA92IcQj6oeXfd90X5-q9BJrKg,51
|
|
74
|
-
omdev/manifests/build.py,sha256=
|
|
74
|
+
omdev/manifests/build.py,sha256=65Bw8gc8avQdXveKqO6hG25LQjdkXknY3cypojmw7Js,10823
|
|
75
75
|
omdev/manifests/load.py,sha256=LtEsluDdd8CkNGj0QGBxee3twBn095Fru0xz2mtr7uk,4788
|
|
76
76
|
omdev/manifests/types.py,sha256=Jv6PAdVLPb9Hh4y6vDhPlWuMNBBViin1bC_u83jfsH4,234
|
|
77
77
|
omdev/mypy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -91,7 +91,7 @@ omdev/precheck/scripts.py,sha256=qq6MXkxgrYngPg5pWnXH4uRSuRkP3mFqbeml1UmvGBc,126
|
|
|
91
91
|
omdev/pyproject/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
|
|
92
92
|
omdev/pyproject/__main__.py,sha256=gn3Rl1aYPYdiTtEqa9ifi0t-e4ZwPY0vhJ4UXvYdJDY,165
|
|
93
93
|
omdev/pyproject/cexts.py,sha256=x13piOOnNrYbA17qZLDVuR0p1sqhgEwpk4FtImX-klM,4281
|
|
94
|
-
omdev/pyproject/cli.py,sha256=
|
|
94
|
+
omdev/pyproject/cli.py,sha256=kw0Jyzywwt6QOc6QHDevWW9p85aXT7jvVFFb8Sb_EAU,11365
|
|
95
95
|
omdev/pyproject/configs.py,sha256=K9H5cGwVLgHi8wKwtYvlXHZ9ThtmnI4jo8JAb-t1-70,2859
|
|
96
96
|
omdev/pyproject/pkg.py,sha256=rNKzJOIgPDrtT2i14Pebldoboz45w00sKb5l_kYFaRI,14562
|
|
97
97
|
omdev/pyproject/reqs.py,sha256=8feZ71YnGzwKbLK4zO28CDQeNcZIIuq6cnkBhs6M-7E,2406
|
|
@@ -101,7 +101,7 @@ omdev/scripts/execrss.py,sha256=d6purJqU99OkMcNxCS1kG2CMfSsw7wjnvBQW7SjyJ70,448
|
|
|
101
101
|
omdev/scripts/exectime.py,sha256=LRVIJsnvGYUqH-zfCdFnrQCZv1KLXJPtWBWplXMDwhI,407
|
|
102
102
|
omdev/scripts/importtrace.py,sha256=4ozdphT4VuP8L0kE0HmGMyWaWHnXg1KEukbET4pFgJU,14064
|
|
103
103
|
omdev/scripts/interp.py,sha256=7xeihsrt3DI_s1fZqNweivBUUwuGkS5C5cWw4QY6q30,70999
|
|
104
|
-
omdev/scripts/pyproject.py,sha256=
|
|
104
|
+
omdev/scripts/pyproject.py,sha256=fuCXOk44Ui5cangCFGi44ckPezawW2N9aJ8bdOAxL50,157493
|
|
105
105
|
omdev/toml/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
|
|
106
106
|
omdev/toml/parser.py,sha256=84bn09uhYHwQGyfww6Rw6y1RxPAE_HDltODOSakcqDM,29186
|
|
107
107
|
omdev/toml/writer.py,sha256=lk3on3YXVbWuLJa-xsOzOhs1bBAT1vXqw4mBbluZl_w,3040
|
|
@@ -114,9 +114,9 @@ omdev/tools/piptools.py,sha256=-jR5q3w4sHqntxCLExFCBNIARB788FUsAbJ62PK2sBU,2774
|
|
|
114
114
|
omdev/tools/proftools.py,sha256=xKSm_yPoCnfsvS3iT9MblDqFMuZmGfI3_koGj8amMyU,145
|
|
115
115
|
omdev/tools/rst.py,sha256=6dWk8QZHoGiLSuBw3TKsXZjjFK6wWBEtPi9krdCLKKg,977
|
|
116
116
|
omdev/tools/sqlrepl.py,sha256=tmFZh80-xsGM62dyQ7_UGLebChrj7IHbIPYBWDJMgVk,5741
|
|
117
|
-
omdev-0.0.0.
|
|
118
|
-
omdev-0.0.0.
|
|
119
|
-
omdev-0.0.0.
|
|
120
|
-
omdev-0.0.0.
|
|
121
|
-
omdev-0.0.0.
|
|
122
|
-
omdev-0.0.0.
|
|
117
|
+
omdev-0.0.0.dev53.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
|
|
118
|
+
omdev-0.0.0.dev53.dist-info/METADATA,sha256=6YK_HOvyV_KKxXOCFMkXHNNny3NmonqWuw5R8nBf6o0,1252
|
|
119
|
+
omdev-0.0.0.dev53.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
|
|
120
|
+
omdev-0.0.0.dev53.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
|
|
121
|
+
omdev-0.0.0.dev53.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
|
|
122
|
+
omdev-0.0.0.dev53.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|