omdev 0.0.0.dev22__tar.gz → 0.0.0.dev24__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of omdev might be problematic. Click here for more details.
- {omdev-0.0.0.dev22/omdev.egg-info → omdev-0.0.0.dev24}/PKG-INFO +2 -2
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/cexts/cmake.py +1 -1
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/interp/pyenv.py +26 -1
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/interp/resolvers.py +1 -1
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/pyproject/cli.py +14 -2
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/scripts/interp.py +160 -6
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/scripts/pyproject.py +174 -8
- omdev-0.0.0.dev24/omdev/tools/importscan.py +187 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24/omdev.egg-info}/PKG-INFO +2 -2
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev.egg-info/SOURCES.txt +2 -1
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev.egg-info/requires.txt +1 -1
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/pyproject.toml +2 -2
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/LICENSE +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/MANIFEST.in +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/README.rst +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/__about__.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/__init__.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/amalg/__init__.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/amalg/__main__.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/amalg/amalg.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/bracepy.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/cexts/__init__.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/cexts/_distutils/__init__.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/cexts/_distutils/build_ext.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/cexts/_distutils/compilers/options.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/cexts/_distutils/dir_util.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/cexts/_distutils/errors.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/cexts/_distutils/extension.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/cexts/_distutils/file_util.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/cexts/_distutils/modified.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/cexts/_distutils/spawn.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/cexts/_distutils/sysconfig.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/cexts/_distutils/util.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/cexts/_distutils/version.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/cexts/build.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/cexts/importhook.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/cexts/magic.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/cexts/scan.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/classdot.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/cmake.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/findimports.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/findmagic.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/interp/__init__.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/interp/__main__.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/interp/cli.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/interp/inspect.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/interp/providers.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/interp/standalone.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/interp/system.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/interp/types.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/mypy/__init__.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/mypy/debug.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/precheck/__init__.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/precheck/__main__.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/precheck/precheck.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/pyproject/__init__.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/pyproject/__main__.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/pyproject/cexts.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/pyproject/configs.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/pyproject/pkg.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/pyproject/reqs.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/revisions.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/scripts/__init__.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/scripts/bumpversion.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/scripts/execrss.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/tokens.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/toml/__init__.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/toml/parser.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/toml/writer.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/tools/__init__.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/tools/dockertools.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/tools/gittools.py +0 -0
- /omdev-0.0.0.dev22/omdev/tools/traceimport.py → /omdev-0.0.0.dev24/omdev/tools/importtrace.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/tools/rst.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/tools/sqlrepl.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/versioning/__init__.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/versioning/specifiers.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/versioning/versions.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev/wheelfile.py +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev.egg-info/dependency_links.txt +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/omdev.egg-info/top_level.txt +0 -0
- {omdev-0.0.0.dev22 → omdev-0.0.0.dev24}/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.dev24
|
|
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.dev24
|
|
16
16
|
Provides-Extra: all
|
|
17
17
|
Requires-Dist: pycparser~=2.22; extra == "all"
|
|
18
18
|
Requires-Dist: cffi~=1.17; extra == "all"
|
|
@@ -92,6 +92,14 @@ class Pyenv:
|
|
|
92
92
|
ret.append(l)
|
|
93
93
|
return ret
|
|
94
94
|
|
|
95
|
+
def update(self) -> bool:
|
|
96
|
+
if (root := self.root()) is None:
|
|
97
|
+
return False
|
|
98
|
+
if not os.path.isdir(os.path.join(root, '.git')):
|
|
99
|
+
return False
|
|
100
|
+
subprocess_check_call('git', 'pull', cwd=root)
|
|
101
|
+
return True
|
|
102
|
+
|
|
95
103
|
|
|
96
104
|
##
|
|
97
105
|
|
|
@@ -292,6 +300,10 @@ class PyenvInterpProvider(InterpProvider):
|
|
|
292
300
|
|
|
293
301
|
inspect: bool = False,
|
|
294
302
|
inspector: InterpInspector = INTERP_INSPECTOR,
|
|
303
|
+
|
|
304
|
+
*,
|
|
305
|
+
|
|
306
|
+
try_update: bool = False,
|
|
295
307
|
) -> None:
|
|
296
308
|
super().__init__()
|
|
297
309
|
|
|
@@ -300,6 +312,8 @@ class PyenvInterpProvider(InterpProvider):
|
|
|
300
312
|
self._inspect = inspect
|
|
301
313
|
self._inspector = inspector
|
|
302
314
|
|
|
315
|
+
self._try_update = try_update
|
|
316
|
+
|
|
303
317
|
#
|
|
304
318
|
|
|
305
319
|
@staticmethod
|
|
@@ -364,8 +378,9 @@ class PyenvInterpProvider(InterpProvider):
|
|
|
364
378
|
|
|
365
379
|
#
|
|
366
380
|
|
|
367
|
-
def
|
|
381
|
+
def _get_installable_versions(self, spec: InterpSpecifier) -> ta.Sequence[InterpVersion]:
|
|
368
382
|
lst = []
|
|
383
|
+
|
|
369
384
|
for vs in self._pyenv.installable_versions():
|
|
370
385
|
if (iv := self.guess_version(vs)) is None:
|
|
371
386
|
continue
|
|
@@ -373,6 +388,16 @@ class PyenvInterpProvider(InterpProvider):
|
|
|
373
388
|
raise Exception('Pyenv installable versions not expected to have debug suffix')
|
|
374
389
|
for d in [False, True]:
|
|
375
390
|
lst.append(dc.replace(iv, opts=dc.replace(iv.opts, debug=d)))
|
|
391
|
+
|
|
392
|
+
return lst
|
|
393
|
+
|
|
394
|
+
def get_installable_versions(self, spec: InterpSpecifier) -> ta.Sequence[InterpVersion]:
|
|
395
|
+
lst = self._get_installable_versions(spec)
|
|
396
|
+
|
|
397
|
+
if self._try_update and not any(v in spec for v in lst):
|
|
398
|
+
if self._pyenv.update():
|
|
399
|
+
lst = self._get_installable_versions(spec)
|
|
400
|
+
|
|
376
401
|
return lst
|
|
377
402
|
|
|
378
403
|
def install_version(self, version: InterpVersion) -> Interp:
|
|
@@ -99,7 +99,7 @@ class InterpResolver:
|
|
|
99
99
|
|
|
100
100
|
DEFAULT_INTERP_RESOLVER = InterpResolver([(p.name, p) for p in [
|
|
101
101
|
# pyenv is preferred to system interpreters as it tends to have more support for things like tkinter
|
|
102
|
-
PyenvInterpProvider(),
|
|
102
|
+
PyenvInterpProvider(try_update=True),
|
|
103
103
|
|
|
104
104
|
RunningInterpProvider(),
|
|
105
105
|
|
|
@@ -243,18 +243,30 @@ def _venv_cmd(args) -> None:
|
|
|
243
243
|
f'--_docker_container={shlex.quote(sd)}',
|
|
244
244
|
*map(shlex.quote, sys.argv[1:]),
|
|
245
245
|
])
|
|
246
|
+
|
|
247
|
+
docker_env = {
|
|
248
|
+
'DOCKER_HOST_PLATFORM': os.environ.get('DOCKER_HOST_PLATFORM', sys.platform),
|
|
249
|
+
}
|
|
250
|
+
for e in args.docker_env or []:
|
|
251
|
+
if '=' in e:
|
|
252
|
+
k, _, v = e.split('=')
|
|
253
|
+
docker_env[k] = v
|
|
254
|
+
else:
|
|
255
|
+
docker_env[e] = os.environ.get(e, '')
|
|
256
|
+
|
|
246
257
|
subprocess_check_call(
|
|
247
258
|
'docker',
|
|
248
259
|
'compose',
|
|
249
260
|
'-f', 'docker/compose.yml',
|
|
250
261
|
'exec',
|
|
251
262
|
*itertools.chain.from_iterable(
|
|
252
|
-
('-e', f'{
|
|
253
|
-
for
|
|
263
|
+
('-e', f'{k}={v}')
|
|
264
|
+
for k, v in docker_env.items()
|
|
254
265
|
),
|
|
255
266
|
'-it', sd,
|
|
256
267
|
'bash', '--login', '-c', script,
|
|
257
268
|
)
|
|
269
|
+
|
|
258
270
|
return
|
|
259
271
|
|
|
260
272
|
cmd = args.cmd
|
|
@@ -1234,13 +1234,134 @@ class StandardLogFormatter(logging.Formatter):
|
|
|
1234
1234
|
##
|
|
1235
1235
|
|
|
1236
1236
|
|
|
1237
|
+
class ProxyLogFilterer(logging.Filterer):
|
|
1238
|
+
def __init__(self, underlying: logging.Filterer) -> None: # noqa
|
|
1239
|
+
self._underlying = underlying
|
|
1240
|
+
|
|
1241
|
+
@property
|
|
1242
|
+
def underlying(self) -> logging.Filterer:
|
|
1243
|
+
return self._underlying
|
|
1244
|
+
|
|
1245
|
+
@property
|
|
1246
|
+
def filters(self):
|
|
1247
|
+
return self._underlying.filters
|
|
1248
|
+
|
|
1249
|
+
@filters.setter
|
|
1250
|
+
def filters(self, filters):
|
|
1251
|
+
self._underlying.filters = filters
|
|
1252
|
+
|
|
1253
|
+
def addFilter(self, filter): # noqa
|
|
1254
|
+
self._underlying.addFilter(filter)
|
|
1255
|
+
|
|
1256
|
+
def removeFilter(self, filter): # noqa
|
|
1257
|
+
self._underlying.removeFilter(filter)
|
|
1258
|
+
|
|
1259
|
+
def filter(self, record):
|
|
1260
|
+
return self._underlying.filter(record)
|
|
1261
|
+
|
|
1262
|
+
|
|
1263
|
+
class ProxyLogHandler(ProxyLogFilterer, logging.Handler):
|
|
1264
|
+
def __init__(self, underlying: logging.Handler) -> None: # noqa
|
|
1265
|
+
ProxyLogFilterer.__init__(self, underlying)
|
|
1266
|
+
|
|
1267
|
+
_underlying: logging.Handler
|
|
1268
|
+
|
|
1269
|
+
@property
|
|
1270
|
+
def underlying(self) -> logging.Handler:
|
|
1271
|
+
return self._underlying
|
|
1272
|
+
|
|
1273
|
+
def get_name(self):
|
|
1274
|
+
return self._underlying.get_name()
|
|
1275
|
+
|
|
1276
|
+
def set_name(self, name):
|
|
1277
|
+
self._underlying.set_name(name)
|
|
1278
|
+
|
|
1279
|
+
@property
|
|
1280
|
+
def name(self):
|
|
1281
|
+
return self._underlying.name
|
|
1282
|
+
|
|
1283
|
+
@property
|
|
1284
|
+
def level(self):
|
|
1285
|
+
return self._underlying.level
|
|
1286
|
+
|
|
1287
|
+
@level.setter
|
|
1288
|
+
def level(self, level):
|
|
1289
|
+
self._underlying.level = level
|
|
1290
|
+
|
|
1291
|
+
@property
|
|
1292
|
+
def formatter(self):
|
|
1293
|
+
return self._underlying.formatter
|
|
1294
|
+
|
|
1295
|
+
@formatter.setter
|
|
1296
|
+
def formatter(self, formatter):
|
|
1297
|
+
self._underlying.formatter = formatter
|
|
1298
|
+
|
|
1299
|
+
def createLock(self):
|
|
1300
|
+
self._underlying.createLock()
|
|
1301
|
+
|
|
1302
|
+
def acquire(self):
|
|
1303
|
+
self._underlying.acquire()
|
|
1304
|
+
|
|
1305
|
+
def release(self):
|
|
1306
|
+
self._underlying.release()
|
|
1307
|
+
|
|
1308
|
+
def setLevel(self, level):
|
|
1309
|
+
self._underlying.setLevel(level)
|
|
1310
|
+
|
|
1311
|
+
def format(self, record):
|
|
1312
|
+
return self._underlying.format(record)
|
|
1313
|
+
|
|
1314
|
+
def emit(self, record):
|
|
1315
|
+
self._underlying.emit(record)
|
|
1316
|
+
|
|
1317
|
+
def handle(self, record):
|
|
1318
|
+
return self._underlying.handle(record)
|
|
1319
|
+
|
|
1320
|
+
def setFormatter(self, fmt):
|
|
1321
|
+
self._underlying.setFormatter(fmt)
|
|
1322
|
+
|
|
1323
|
+
def flush(self):
|
|
1324
|
+
self._underlying.flush()
|
|
1325
|
+
|
|
1326
|
+
def close(self):
|
|
1327
|
+
self._underlying.close()
|
|
1328
|
+
|
|
1329
|
+
def handleError(self, record):
|
|
1330
|
+
self._underlying.handleError(record)
|
|
1331
|
+
|
|
1332
|
+
|
|
1333
|
+
##
|
|
1334
|
+
|
|
1335
|
+
|
|
1336
|
+
class StandardLogHandler(ProxyLogHandler):
|
|
1337
|
+
pass
|
|
1338
|
+
|
|
1339
|
+
|
|
1340
|
+
##
|
|
1341
|
+
|
|
1342
|
+
|
|
1237
1343
|
def configure_standard_logging(
|
|
1238
1344
|
level: ta.Union[int, str] = logging.INFO,
|
|
1239
1345
|
*,
|
|
1240
1346
|
json: bool = False,
|
|
1241
|
-
|
|
1347
|
+
target: ta.Optional[logging.Logger] = None,
|
|
1348
|
+
no_check: bool = False,
|
|
1349
|
+
) -> ta.Optional[StandardLogHandler]:
|
|
1350
|
+
if target is None:
|
|
1351
|
+
target = logging.root
|
|
1352
|
+
|
|
1353
|
+
#
|
|
1354
|
+
|
|
1355
|
+
if not no_check:
|
|
1356
|
+
if any(isinstance(h, StandardLogHandler) for h in list(target.handlers)):
|
|
1357
|
+
return None
|
|
1358
|
+
|
|
1359
|
+
#
|
|
1360
|
+
|
|
1242
1361
|
handler = logging.StreamHandler()
|
|
1243
1362
|
|
|
1363
|
+
#
|
|
1364
|
+
|
|
1244
1365
|
formatter: logging.Formatter
|
|
1245
1366
|
if json:
|
|
1246
1367
|
formatter = JsonLogFormatter()
|
|
@@ -1248,14 +1369,22 @@ def configure_standard_logging(
|
|
|
1248
1369
|
formatter = StandardLogFormatter(StandardLogFormatter.build_log_format(STANDARD_LOG_FORMAT_PARTS))
|
|
1249
1370
|
handler.setFormatter(formatter)
|
|
1250
1371
|
|
|
1372
|
+
#
|
|
1373
|
+
|
|
1251
1374
|
handler.addFilter(TidLogFilter())
|
|
1252
1375
|
|
|
1253
|
-
|
|
1376
|
+
#
|
|
1377
|
+
|
|
1378
|
+
target.addHandler(handler)
|
|
1379
|
+
|
|
1380
|
+
#
|
|
1254
1381
|
|
|
1255
1382
|
if level is not None:
|
|
1256
|
-
|
|
1383
|
+
target.setLevel(level)
|
|
1384
|
+
|
|
1385
|
+
#
|
|
1257
1386
|
|
|
1258
|
-
return handler
|
|
1387
|
+
return StandardLogHandler(handler)
|
|
1259
1388
|
|
|
1260
1389
|
|
|
1261
1390
|
########################################
|
|
@@ -1705,6 +1834,14 @@ class Pyenv:
|
|
|
1705
1834
|
ret.append(l)
|
|
1706
1835
|
return ret
|
|
1707
1836
|
|
|
1837
|
+
def update(self) -> bool:
|
|
1838
|
+
if (root := self.root()) is None:
|
|
1839
|
+
return False
|
|
1840
|
+
if not os.path.isdir(os.path.join(root, '.git')):
|
|
1841
|
+
return False
|
|
1842
|
+
subprocess_check_call('git', 'pull', cwd=root)
|
|
1843
|
+
return True
|
|
1844
|
+
|
|
1708
1845
|
|
|
1709
1846
|
##
|
|
1710
1847
|
|
|
@@ -1905,6 +2042,10 @@ class PyenvInterpProvider(InterpProvider):
|
|
|
1905
2042
|
|
|
1906
2043
|
inspect: bool = False,
|
|
1907
2044
|
inspector: InterpInspector = INTERP_INSPECTOR,
|
|
2045
|
+
|
|
2046
|
+
*,
|
|
2047
|
+
|
|
2048
|
+
try_update: bool = False,
|
|
1908
2049
|
) -> None:
|
|
1909
2050
|
super().__init__()
|
|
1910
2051
|
|
|
@@ -1913,6 +2054,8 @@ class PyenvInterpProvider(InterpProvider):
|
|
|
1913
2054
|
self._inspect = inspect
|
|
1914
2055
|
self._inspector = inspector
|
|
1915
2056
|
|
|
2057
|
+
self._try_update = try_update
|
|
2058
|
+
|
|
1916
2059
|
#
|
|
1917
2060
|
|
|
1918
2061
|
@staticmethod
|
|
@@ -1977,8 +2120,9 @@ class PyenvInterpProvider(InterpProvider):
|
|
|
1977
2120
|
|
|
1978
2121
|
#
|
|
1979
2122
|
|
|
1980
|
-
def
|
|
2123
|
+
def _get_installable_versions(self, spec: InterpSpecifier) -> ta.Sequence[InterpVersion]:
|
|
1981
2124
|
lst = []
|
|
2125
|
+
|
|
1982
2126
|
for vs in self._pyenv.installable_versions():
|
|
1983
2127
|
if (iv := self.guess_version(vs)) is None:
|
|
1984
2128
|
continue
|
|
@@ -1986,6 +2130,16 @@ class PyenvInterpProvider(InterpProvider):
|
|
|
1986
2130
|
raise Exception('Pyenv installable versions not expected to have debug suffix')
|
|
1987
2131
|
for d in [False, True]:
|
|
1988
2132
|
lst.append(dc.replace(iv, opts=dc.replace(iv.opts, debug=d)))
|
|
2133
|
+
|
|
2134
|
+
return lst
|
|
2135
|
+
|
|
2136
|
+
def get_installable_versions(self, spec: InterpSpecifier) -> ta.Sequence[InterpVersion]:
|
|
2137
|
+
lst = self._get_installable_versions(spec)
|
|
2138
|
+
|
|
2139
|
+
if self._try_update and not any(v in spec for v in lst):
|
|
2140
|
+
if self._pyenv.update():
|
|
2141
|
+
lst = self._get_installable_versions(spec)
|
|
2142
|
+
|
|
1989
2143
|
return lst
|
|
1990
2144
|
|
|
1991
2145
|
def install_version(self, version: InterpVersion) -> Interp:
|
|
@@ -2208,7 +2362,7 @@ class InterpResolver:
|
|
|
2208
2362
|
|
|
2209
2363
|
DEFAULT_INTERP_RESOLVER = InterpResolver([(p.name, p) for p in [
|
|
2210
2364
|
# pyenv is preferred to system interpreters as it tends to have more support for things like tkinter
|
|
2211
|
-
PyenvInterpProvider(),
|
|
2365
|
+
PyenvInterpProvider(try_update=True),
|
|
2212
2366
|
|
|
2213
2367
|
RunningInterpProvider(),
|
|
2214
2368
|
|
|
@@ -2580,13 +2580,134 @@ class StandardLogFormatter(logging.Formatter):
|
|
|
2580
2580
|
##
|
|
2581
2581
|
|
|
2582
2582
|
|
|
2583
|
+
class ProxyLogFilterer(logging.Filterer):
|
|
2584
|
+
def __init__(self, underlying: logging.Filterer) -> None: # noqa
|
|
2585
|
+
self._underlying = underlying
|
|
2586
|
+
|
|
2587
|
+
@property
|
|
2588
|
+
def underlying(self) -> logging.Filterer:
|
|
2589
|
+
return self._underlying
|
|
2590
|
+
|
|
2591
|
+
@property
|
|
2592
|
+
def filters(self):
|
|
2593
|
+
return self._underlying.filters
|
|
2594
|
+
|
|
2595
|
+
@filters.setter
|
|
2596
|
+
def filters(self, filters):
|
|
2597
|
+
self._underlying.filters = filters
|
|
2598
|
+
|
|
2599
|
+
def addFilter(self, filter): # noqa
|
|
2600
|
+
self._underlying.addFilter(filter)
|
|
2601
|
+
|
|
2602
|
+
def removeFilter(self, filter): # noqa
|
|
2603
|
+
self._underlying.removeFilter(filter)
|
|
2604
|
+
|
|
2605
|
+
def filter(self, record):
|
|
2606
|
+
return self._underlying.filter(record)
|
|
2607
|
+
|
|
2608
|
+
|
|
2609
|
+
class ProxyLogHandler(ProxyLogFilterer, logging.Handler):
|
|
2610
|
+
def __init__(self, underlying: logging.Handler) -> None: # noqa
|
|
2611
|
+
ProxyLogFilterer.__init__(self, underlying)
|
|
2612
|
+
|
|
2613
|
+
_underlying: logging.Handler
|
|
2614
|
+
|
|
2615
|
+
@property
|
|
2616
|
+
def underlying(self) -> logging.Handler:
|
|
2617
|
+
return self._underlying
|
|
2618
|
+
|
|
2619
|
+
def get_name(self):
|
|
2620
|
+
return self._underlying.get_name()
|
|
2621
|
+
|
|
2622
|
+
def set_name(self, name):
|
|
2623
|
+
self._underlying.set_name(name)
|
|
2624
|
+
|
|
2625
|
+
@property
|
|
2626
|
+
def name(self):
|
|
2627
|
+
return self._underlying.name
|
|
2628
|
+
|
|
2629
|
+
@property
|
|
2630
|
+
def level(self):
|
|
2631
|
+
return self._underlying.level
|
|
2632
|
+
|
|
2633
|
+
@level.setter
|
|
2634
|
+
def level(self, level):
|
|
2635
|
+
self._underlying.level = level
|
|
2636
|
+
|
|
2637
|
+
@property
|
|
2638
|
+
def formatter(self):
|
|
2639
|
+
return self._underlying.formatter
|
|
2640
|
+
|
|
2641
|
+
@formatter.setter
|
|
2642
|
+
def formatter(self, formatter):
|
|
2643
|
+
self._underlying.formatter = formatter
|
|
2644
|
+
|
|
2645
|
+
def createLock(self):
|
|
2646
|
+
self._underlying.createLock()
|
|
2647
|
+
|
|
2648
|
+
def acquire(self):
|
|
2649
|
+
self._underlying.acquire()
|
|
2650
|
+
|
|
2651
|
+
def release(self):
|
|
2652
|
+
self._underlying.release()
|
|
2653
|
+
|
|
2654
|
+
def setLevel(self, level):
|
|
2655
|
+
self._underlying.setLevel(level)
|
|
2656
|
+
|
|
2657
|
+
def format(self, record):
|
|
2658
|
+
return self._underlying.format(record)
|
|
2659
|
+
|
|
2660
|
+
def emit(self, record):
|
|
2661
|
+
self._underlying.emit(record)
|
|
2662
|
+
|
|
2663
|
+
def handle(self, record):
|
|
2664
|
+
return self._underlying.handle(record)
|
|
2665
|
+
|
|
2666
|
+
def setFormatter(self, fmt):
|
|
2667
|
+
self._underlying.setFormatter(fmt)
|
|
2668
|
+
|
|
2669
|
+
def flush(self):
|
|
2670
|
+
self._underlying.flush()
|
|
2671
|
+
|
|
2672
|
+
def close(self):
|
|
2673
|
+
self._underlying.close()
|
|
2674
|
+
|
|
2675
|
+
def handleError(self, record):
|
|
2676
|
+
self._underlying.handleError(record)
|
|
2677
|
+
|
|
2678
|
+
|
|
2679
|
+
##
|
|
2680
|
+
|
|
2681
|
+
|
|
2682
|
+
class StandardLogHandler(ProxyLogHandler):
|
|
2683
|
+
pass
|
|
2684
|
+
|
|
2685
|
+
|
|
2686
|
+
##
|
|
2687
|
+
|
|
2688
|
+
|
|
2583
2689
|
def configure_standard_logging(
|
|
2584
2690
|
level: ta.Union[int, str] = logging.INFO,
|
|
2585
2691
|
*,
|
|
2586
2692
|
json: bool = False,
|
|
2587
|
-
|
|
2693
|
+
target: ta.Optional[logging.Logger] = None,
|
|
2694
|
+
no_check: bool = False,
|
|
2695
|
+
) -> ta.Optional[StandardLogHandler]:
|
|
2696
|
+
if target is None:
|
|
2697
|
+
target = logging.root
|
|
2698
|
+
|
|
2699
|
+
#
|
|
2700
|
+
|
|
2701
|
+
if not no_check:
|
|
2702
|
+
if any(isinstance(h, StandardLogHandler) for h in list(target.handlers)):
|
|
2703
|
+
return None
|
|
2704
|
+
|
|
2705
|
+
#
|
|
2706
|
+
|
|
2588
2707
|
handler = logging.StreamHandler()
|
|
2589
2708
|
|
|
2709
|
+
#
|
|
2710
|
+
|
|
2590
2711
|
formatter: logging.Formatter
|
|
2591
2712
|
if json:
|
|
2592
2713
|
formatter = JsonLogFormatter()
|
|
@@ -2594,14 +2715,22 @@ def configure_standard_logging(
|
|
|
2594
2715
|
formatter = StandardLogFormatter(StandardLogFormatter.build_log_format(STANDARD_LOG_FORMAT_PARTS))
|
|
2595
2716
|
handler.setFormatter(formatter)
|
|
2596
2717
|
|
|
2718
|
+
#
|
|
2719
|
+
|
|
2597
2720
|
handler.addFilter(TidLogFilter())
|
|
2598
2721
|
|
|
2599
|
-
|
|
2722
|
+
#
|
|
2723
|
+
|
|
2724
|
+
target.addHandler(handler)
|
|
2725
|
+
|
|
2726
|
+
#
|
|
2600
2727
|
|
|
2601
2728
|
if level is not None:
|
|
2602
|
-
|
|
2729
|
+
target.setLevel(level)
|
|
2603
2730
|
|
|
2604
|
-
|
|
2731
|
+
#
|
|
2732
|
+
|
|
2733
|
+
return StandardLogHandler(handler)
|
|
2605
2734
|
|
|
2606
2735
|
|
|
2607
2736
|
########################################
|
|
@@ -3973,6 +4102,14 @@ class Pyenv:
|
|
|
3973
4102
|
ret.append(l)
|
|
3974
4103
|
return ret
|
|
3975
4104
|
|
|
4105
|
+
def update(self) -> bool:
|
|
4106
|
+
if (root := self.root()) is None:
|
|
4107
|
+
return False
|
|
4108
|
+
if not os.path.isdir(os.path.join(root, '.git')):
|
|
4109
|
+
return False
|
|
4110
|
+
subprocess_check_call('git', 'pull', cwd=root)
|
|
4111
|
+
return True
|
|
4112
|
+
|
|
3976
4113
|
|
|
3977
4114
|
##
|
|
3978
4115
|
|
|
@@ -4173,6 +4310,10 @@ class PyenvInterpProvider(InterpProvider):
|
|
|
4173
4310
|
|
|
4174
4311
|
inspect: bool = False,
|
|
4175
4312
|
inspector: InterpInspector = INTERP_INSPECTOR,
|
|
4313
|
+
|
|
4314
|
+
*,
|
|
4315
|
+
|
|
4316
|
+
try_update: bool = False,
|
|
4176
4317
|
) -> None:
|
|
4177
4318
|
super().__init__()
|
|
4178
4319
|
|
|
@@ -4181,6 +4322,8 @@ class PyenvInterpProvider(InterpProvider):
|
|
|
4181
4322
|
self._inspect = inspect
|
|
4182
4323
|
self._inspector = inspector
|
|
4183
4324
|
|
|
4325
|
+
self._try_update = try_update
|
|
4326
|
+
|
|
4184
4327
|
#
|
|
4185
4328
|
|
|
4186
4329
|
@staticmethod
|
|
@@ -4245,8 +4388,9 @@ class PyenvInterpProvider(InterpProvider):
|
|
|
4245
4388
|
|
|
4246
4389
|
#
|
|
4247
4390
|
|
|
4248
|
-
def
|
|
4391
|
+
def _get_installable_versions(self, spec: InterpSpecifier) -> ta.Sequence[InterpVersion]:
|
|
4249
4392
|
lst = []
|
|
4393
|
+
|
|
4250
4394
|
for vs in self._pyenv.installable_versions():
|
|
4251
4395
|
if (iv := self.guess_version(vs)) is None:
|
|
4252
4396
|
continue
|
|
@@ -4254,6 +4398,16 @@ class PyenvInterpProvider(InterpProvider):
|
|
|
4254
4398
|
raise Exception('Pyenv installable versions not expected to have debug suffix')
|
|
4255
4399
|
for d in [False, True]:
|
|
4256
4400
|
lst.append(dc.replace(iv, opts=dc.replace(iv.opts, debug=d)))
|
|
4401
|
+
|
|
4402
|
+
return lst
|
|
4403
|
+
|
|
4404
|
+
def get_installable_versions(self, spec: InterpSpecifier) -> ta.Sequence[InterpVersion]:
|
|
4405
|
+
lst = self._get_installable_versions(spec)
|
|
4406
|
+
|
|
4407
|
+
if self._try_update and not any(v in spec for v in lst):
|
|
4408
|
+
if self._pyenv.update():
|
|
4409
|
+
lst = self._get_installable_versions(spec)
|
|
4410
|
+
|
|
4257
4411
|
return lst
|
|
4258
4412
|
|
|
4259
4413
|
def install_version(self, version: InterpVersion) -> Interp:
|
|
@@ -4476,7 +4630,7 @@ class InterpResolver:
|
|
|
4476
4630
|
|
|
4477
4631
|
DEFAULT_INTERP_RESOLVER = InterpResolver([(p.name, p) for p in [
|
|
4478
4632
|
# pyenv is preferred to system interpreters as it tends to have more support for things like tkinter
|
|
4479
|
-
PyenvInterpProvider(),
|
|
4633
|
+
PyenvInterpProvider(try_update=True),
|
|
4480
4634
|
|
|
4481
4635
|
RunningInterpProvider(),
|
|
4482
4636
|
|
|
@@ -4679,18 +4833,30 @@ def _venv_cmd(args) -> None:
|
|
|
4679
4833
|
f'--_docker_container={shlex.quote(sd)}',
|
|
4680
4834
|
*map(shlex.quote, sys.argv[1:]),
|
|
4681
4835
|
])
|
|
4836
|
+
|
|
4837
|
+
docker_env = {
|
|
4838
|
+
'DOCKER_HOST_PLATFORM': os.environ.get('DOCKER_HOST_PLATFORM', sys.platform),
|
|
4839
|
+
}
|
|
4840
|
+
for e in args.docker_env or []:
|
|
4841
|
+
if '=' in e:
|
|
4842
|
+
k, _, v = e.split('=')
|
|
4843
|
+
docker_env[k] = v
|
|
4844
|
+
else:
|
|
4845
|
+
docker_env[e] = os.environ.get(e, '')
|
|
4846
|
+
|
|
4682
4847
|
subprocess_check_call(
|
|
4683
4848
|
'docker',
|
|
4684
4849
|
'compose',
|
|
4685
4850
|
'-f', 'docker/compose.yml',
|
|
4686
4851
|
'exec',
|
|
4687
4852
|
*itertools.chain.from_iterable(
|
|
4688
|
-
('-e', f'{
|
|
4689
|
-
for
|
|
4853
|
+
('-e', f'{k}={v}')
|
|
4854
|
+
for k, v in docker_env.items()
|
|
4690
4855
|
),
|
|
4691
4856
|
'-it', sd,
|
|
4692
4857
|
'bash', '--login', '-c', script,
|
|
4693
4858
|
)
|
|
4859
|
+
|
|
4694
4860
|
return
|
|
4695
4861
|
|
|
4696
4862
|
cmd = args.cmd
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"""
|
|
2
|
+
TODO:
|
|
3
|
+
- dump agg stats
|
|
4
|
+
- graphviz
|
|
5
|
+
"""
|
|
6
|
+
import argparse
|
|
7
|
+
import dataclasses as dc
|
|
8
|
+
import inspect
|
|
9
|
+
import json
|
|
10
|
+
import os
|
|
11
|
+
import re
|
|
12
|
+
import shlex
|
|
13
|
+
import subprocess
|
|
14
|
+
import sys
|
|
15
|
+
import typing as ta
|
|
16
|
+
|
|
17
|
+
from omlish import concurrent as cu
|
|
18
|
+
from omlish import lang
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
##
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@dc.dataclass(frozen=True)
|
|
25
|
+
class Item:
|
|
26
|
+
spec: str
|
|
27
|
+
|
|
28
|
+
time: float
|
|
29
|
+
rss: int
|
|
30
|
+
imported: frozenset[str]
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
##
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _payload(specs) -> None:
|
|
37
|
+
import resource
|
|
38
|
+
import sys
|
|
39
|
+
import time
|
|
40
|
+
|
|
41
|
+
def get_rss() -> int:
|
|
42
|
+
return resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
|
|
43
|
+
|
|
44
|
+
start_modules = frozenset(sys.modules)
|
|
45
|
+
start_rss = get_rss()
|
|
46
|
+
start_time = time.time()
|
|
47
|
+
|
|
48
|
+
for spec in specs:
|
|
49
|
+
exec(f'import {spec}')
|
|
50
|
+
|
|
51
|
+
end_time = time.time()
|
|
52
|
+
end_rss = get_rss()
|
|
53
|
+
end_modules = frozenset(sys.modules)
|
|
54
|
+
|
|
55
|
+
import json
|
|
56
|
+
|
|
57
|
+
def json_dumps(obj):
|
|
58
|
+
return json.dumps(obj, indent=None, separators=(',', ':'))
|
|
59
|
+
|
|
60
|
+
print(json_dumps({
|
|
61
|
+
'time': end_time - start_time,
|
|
62
|
+
'rss': end_rss - start_rss,
|
|
63
|
+
'imported': sorted(end_modules - start_modules),
|
|
64
|
+
}))
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@lang.cached_function
|
|
68
|
+
def payload_src() -> str:
|
|
69
|
+
return inspect.getsource(_payload)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def run_one(
|
|
73
|
+
spec: str,
|
|
74
|
+
*,
|
|
75
|
+
shell_wrap: bool = True,
|
|
76
|
+
) -> Item:
|
|
77
|
+
spec_payload_src = '\n\n'.join([
|
|
78
|
+
payload_src(),
|
|
79
|
+
f'_payload([{spec!r}])',
|
|
80
|
+
])
|
|
81
|
+
|
|
82
|
+
args = [
|
|
83
|
+
sys.executable,
|
|
84
|
+
'-c',
|
|
85
|
+
spec_payload_src,
|
|
86
|
+
]
|
|
87
|
+
if shell_wrap:
|
|
88
|
+
args = ['sh', '-c', ' '.join(map(shlex.quote, args))]
|
|
89
|
+
|
|
90
|
+
output = subprocess.check_output(args)
|
|
91
|
+
|
|
92
|
+
output_lines = output.decode().strip().splitlines()
|
|
93
|
+
if not output_lines:
|
|
94
|
+
raise Exception(f'no output: {spec}')
|
|
95
|
+
if len(output_lines) > 1:
|
|
96
|
+
print(f'warning: unexpected output: {spec}')
|
|
97
|
+
|
|
98
|
+
dct = json.loads(output_lines[-1])
|
|
99
|
+
return Item(
|
|
100
|
+
spec=spec,
|
|
101
|
+
**dct,
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
##
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def _find_specs(
|
|
109
|
+
*roots: str,
|
|
110
|
+
filters: ta.Iterable[str] | None = None,
|
|
111
|
+
) -> ta.Sequence[str]:
|
|
112
|
+
filter_pats = [re.compile(f) for f in filters or []]
|
|
113
|
+
|
|
114
|
+
out: list[str] = []
|
|
115
|
+
stk: list[str] = list(reversed(roots))
|
|
116
|
+
while stk:
|
|
117
|
+
cur = stk.pop()
|
|
118
|
+
if os.sep in cur:
|
|
119
|
+
if os.path.isdir(cur):
|
|
120
|
+
stk.extend(reversed([
|
|
121
|
+
os.path.join(cur, c)
|
|
122
|
+
for c in os.listdir(cur)
|
|
123
|
+
]))
|
|
124
|
+
continue
|
|
125
|
+
|
|
126
|
+
if not cur.endswith('.py'):
|
|
127
|
+
continue
|
|
128
|
+
|
|
129
|
+
spec = cur.rpartition('.')[0].replace(os.sep, '.')
|
|
130
|
+
|
|
131
|
+
else:
|
|
132
|
+
spec = cur
|
|
133
|
+
|
|
134
|
+
if any(p.fullmatch(spec) for p in filter_pats):
|
|
135
|
+
continue
|
|
136
|
+
|
|
137
|
+
out.append(spec)
|
|
138
|
+
|
|
139
|
+
return out
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def run(
|
|
143
|
+
*roots: str,
|
|
144
|
+
filters: ta.Iterable[str] | None = None,
|
|
145
|
+
num_threads: int | None = 0,
|
|
146
|
+
**kwargs: ta.Any,
|
|
147
|
+
) -> ta.Mapping[str, Item]:
|
|
148
|
+
specs = _find_specs(*roots, filters=filters)
|
|
149
|
+
|
|
150
|
+
out: dict[str, Item] = {}
|
|
151
|
+
with cu.new_executor(num_threads) as ex:
|
|
152
|
+
futs = [ex.submit(run_one, spec, **kwargs) for spec in specs]
|
|
153
|
+
for fut in futs:
|
|
154
|
+
item = fut.result()
|
|
155
|
+
out[item.spec] = item
|
|
156
|
+
|
|
157
|
+
return out
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
##
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def _main() -> None:
|
|
164
|
+
parser = argparse.ArgumentParser()
|
|
165
|
+
parser.add_argument('-j', '--jobs', type=int)
|
|
166
|
+
parser.add_argument('-f', '--filter', action='append')
|
|
167
|
+
parser.add_argument('-t', '--filter-tests', action='store_true')
|
|
168
|
+
parser.add_argument('root', nargs='+')
|
|
169
|
+
args = parser.parse_args()
|
|
170
|
+
|
|
171
|
+
filters = [*(args.filter or [])]
|
|
172
|
+
if args.filter_tests:
|
|
173
|
+
filters.extend([
|
|
174
|
+
r'.*\.conftest',
|
|
175
|
+
r'.*\.tests\..*',
|
|
176
|
+
])
|
|
177
|
+
|
|
178
|
+
for item in run(
|
|
179
|
+
*args.root,
|
|
180
|
+
filters=filters,
|
|
181
|
+
num_threads=args.jobs,
|
|
182
|
+
).values():
|
|
183
|
+
print(json.dumps(dc.asdict(item)))
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
if __name__ == '__main__':
|
|
187
|
+
_main()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: omdev
|
|
3
|
-
Version: 0.0.0.
|
|
3
|
+
Version: 0.0.0.dev24
|
|
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.dev24
|
|
16
16
|
Provides-Extra: all
|
|
17
17
|
Requires-Dist: pycparser~=2.22; extra == "all"
|
|
18
18
|
Requires-Dist: cffi~=1.17; extra == "all"
|
|
@@ -74,9 +74,10 @@ omdev/toml/writer.py
|
|
|
74
74
|
omdev/tools/__init__.py
|
|
75
75
|
omdev/tools/dockertools.py
|
|
76
76
|
omdev/tools/gittools.py
|
|
77
|
+
omdev/tools/importscan.py
|
|
78
|
+
omdev/tools/importtrace.py
|
|
77
79
|
omdev/tools/rst.py
|
|
78
80
|
omdev/tools/sqlrepl.py
|
|
79
|
-
omdev/tools/traceimport.py
|
|
80
81
|
omdev/versioning/__init__.py
|
|
81
82
|
omdev/versioning/specifiers.py
|
|
82
83
|
omdev/versioning/versions.py
|
|
@@ -12,7 +12,7 @@ authors = [
|
|
|
12
12
|
urls = {source = 'https://github.com/wrmsr/omlish'}
|
|
13
13
|
license = {text = 'BSD-3-Clause'}
|
|
14
14
|
requires-python = '~=3.12'
|
|
15
|
-
version = '0.0.0.
|
|
15
|
+
version = '0.0.0.dev24'
|
|
16
16
|
classifiers = [
|
|
17
17
|
'License :: OSI Approved :: BSD License',
|
|
18
18
|
'Development Status :: 2 - Pre-Alpha',
|
|
@@ -22,7 +22,7 @@ classifiers = [
|
|
|
22
22
|
]
|
|
23
23
|
description = 'omdev'
|
|
24
24
|
dependencies = [
|
|
25
|
-
'omlish == 0.0.0.
|
|
25
|
+
'omlish == 0.0.0.dev24',
|
|
26
26
|
]
|
|
27
27
|
|
|
28
28
|
[project.optional-dependencies]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/omdev-0.0.0.dev22/omdev/tools/traceimport.py → /omdev-0.0.0.dev24/omdev/tools/importtrace.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|