omdev 0.0.0.dev50__tar.gz → 0.0.0.dev52__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.

Files changed (129) hide show
  1. {omdev-0.0.0.dev50/omdev.egg-info → omdev-0.0.0.dev52}/PKG-INFO +2 -2
  2. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/.manifests.json +12 -0
  3. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/interp/pyenv.py +6 -5
  4. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/manifests/build.py +35 -15
  5. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/pyproject/reqs.py +2 -0
  6. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/scripts/interp.py +6 -5
  7. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/scripts/pyproject.py +83 -81
  8. omdev-0.0.0.dev52/omdev/secrets.py +17 -0
  9. omdev-0.0.0.dev52/omdev/tools/mkrelimp.py +169 -0
  10. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52/omdev.egg-info}/PKG-INFO +2 -2
  11. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev.egg-info/SOURCES.txt +1 -0
  12. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev.egg-info/requires.txt +1 -1
  13. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/pyproject.toml +3 -2
  14. omdev-0.0.0.dev50/omdev/secrets.py +0 -12
  15. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/LICENSE +0 -0
  16. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/MANIFEST.in +0 -0
  17. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/README.rst +0 -0
  18. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/__about__.py +0 -0
  19. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/__init__.py +0 -0
  20. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/amalg/__init__.py +0 -0
  21. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/amalg/__main__.py +0 -0
  22. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/amalg/amalg.py +0 -0
  23. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/bracepy.py +0 -0
  24. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cache/__init__.py +0 -0
  25. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cache/compute/__init__.py +0 -0
  26. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cache/compute/cache.py +0 -0
  27. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cache/compute/contexts.py +0 -0
  28. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cache/compute/currents.py +0 -0
  29. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cache/compute/fns.py +0 -0
  30. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cache/compute/resolvers.py +0 -0
  31. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cache/compute/storage.py +0 -0
  32. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cache/compute/types.py +0 -0
  33. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cache/data/__init__.py +0 -0
  34. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cache/data/actions.py +0 -0
  35. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cache/data/cache.py +0 -0
  36. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cache/data/consts.py +0 -0
  37. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cache/data/defaults.py +0 -0
  38. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cache/data/manifests.py +0 -0
  39. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cache/data/specs.py +0 -0
  40. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cexts/__init__.py +0 -0
  41. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cexts/_boilerplate.cc +0 -0
  42. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cexts/_distutils/LICENSE +0 -0
  43. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cexts/_distutils/__init__.py +0 -0
  44. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cexts/_distutils/build_ext.py +0 -0
  45. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  46. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  47. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cexts/_distutils/compilers/options.py +0 -0
  48. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  49. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cexts/_distutils/dir_util.py +0 -0
  50. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cexts/_distutils/errors.py +0 -0
  51. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cexts/_distutils/extension.py +0 -0
  52. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cexts/_distutils/file_util.py +0 -0
  53. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cexts/_distutils/modified.py +0 -0
  54. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cexts/_distutils/spawn.py +0 -0
  55. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cexts/_distutils/sysconfig.py +0 -0
  56. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cexts/_distutils/util.py +0 -0
  57. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cexts/_distutils/version.py +0 -0
  58. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cexts/build.py +0 -0
  59. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cexts/cmake.py +0 -0
  60. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cexts/importhook.py +0 -0
  61. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cexts/magic.py +0 -0
  62. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cexts/scan.py +0 -0
  63. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/classdot.py +0 -0
  64. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cli/__init__.py +0 -0
  65. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cli/__main__.py +0 -0
  66. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cli/clicli.py +0 -0
  67. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cli/install.py +0 -0
  68. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cli/main.py +0 -0
  69. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cli/managers.py +0 -0
  70. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cli/types.py +0 -0
  71. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/cmake.py +0 -0
  72. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/findimports.py +0 -0
  73. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/findmagic.py +0 -0
  74. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/git.py +0 -0
  75. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/interp/__init__.py +0 -0
  76. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/interp/__main__.py +0 -0
  77. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/interp/cli.py +0 -0
  78. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/interp/inspect.py +0 -0
  79. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/interp/providers.py +0 -0
  80. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/interp/resolvers.py +0 -0
  81. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/interp/standalone.py +0 -0
  82. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/interp/system.py +0 -0
  83. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/interp/types.py +0 -0
  84. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/manifests/__init__.py +0 -0
  85. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/manifests/load.py +0 -0
  86. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/manifests/types.py +0 -0
  87. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/mypy/__init__.py +0 -0
  88. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/mypy/debug.py +0 -0
  89. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/packaging/__init__.py +0 -0
  90. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/packaging/names.py +0 -0
  91. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/packaging/requires.py +0 -0
  92. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/packaging/specifiers.py +0 -0
  93. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/packaging/versions.py +0 -0
  94. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/precheck/__init__.py +0 -0
  95. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/precheck/__main__.py +0 -0
  96. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/precheck/base.py +0 -0
  97. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/precheck/git.py +0 -0
  98. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/precheck/lite.py +0 -0
  99. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/precheck/precheck.py +0 -0
  100. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/precheck/scripts.py +0 -0
  101. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/pyproject/__init__.py +0 -0
  102. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/pyproject/__main__.py +0 -0
  103. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/pyproject/cexts.py +0 -0
  104. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/pyproject/cli.py +0 -0
  105. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/pyproject/configs.py +0 -0
  106. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/pyproject/pkg.py +0 -0
  107. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/revisions.py +0 -0
  108. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/scripts/__init__.py +0 -0
  109. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/scripts/bumpversion.py +0 -0
  110. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/scripts/execrss.py +0 -0
  111. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/scripts/exectime.py +0 -0
  112. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/scripts/importtrace.py +0 -0
  113. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/tokens.py +0 -0
  114. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/toml/__init__.py +0 -0
  115. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/toml/parser.py +0 -0
  116. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/toml/writer.py +0 -0
  117. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/tools/__init__.py +0 -0
  118. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/tools/dockertools.py +0 -0
  119. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/tools/gittools.py +0 -0
  120. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/tools/importscan.py +0 -0
  121. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/tools/piptools.py +0 -0
  122. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/tools/proftools.py +0 -0
  123. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/tools/rst.py +0 -0
  124. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/tools/sqlrepl.py +0 -0
  125. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev/wheelfile.py +0 -0
  126. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev.egg-info/dependency_links.txt +0 -0
  127. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev.egg-info/entry_points.txt +0 -0
  128. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/omdev.egg-info/top_level.txt +0 -0
  129. {omdev-0.0.0.dev50 → omdev-0.0.0.dev52}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omdev
3
- Version: 0.0.0.dev50
3
+ Version: 0.0.0.dev52
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.dev50
15
+ Requires-Dist: omlish==0.0.0.dev52
16
16
  Provides-Extra: all
17
17
  Requires-Dist: pycparser~=2.22; extra == "all"
18
18
  Requires-Dist: cffi~=1.17; extra == "all"
@@ -155,6 +155,18 @@
155
155
  }
156
156
  }
157
157
  },
158
+ {
159
+ "module": ".tools.mkrelimp",
160
+ "attr": "_CLI_MODULE",
161
+ "file": "omdev/tools/mkrelimp.py",
162
+ "line": 148,
163
+ "value": {
164
+ "$.cli.types.CliModule": {
165
+ "cmd_name": "mkrelimp",
166
+ "mod_name": "omdev.tools.mkrelimp"
167
+ }
168
+ }
169
+ },
158
170
  {
159
171
  "module": ".tools.piptools",
160
172
  "attr": "_CLI_MODULE",
@@ -76,11 +76,12 @@ class Pyenv:
76
76
  return []
77
77
  ret = []
78
78
  vp = os.path.join(root, 'versions')
79
- for dn in os.listdir(vp):
80
- ep = os.path.join(vp, dn, 'bin', 'python')
81
- if not os.path.isfile(ep):
82
- continue
83
- ret.append((dn, ep))
79
+ if os.path.isdir(vp):
80
+ for dn in os.listdir(vp):
81
+ ep = os.path.join(vp, dn, 'bin', 'python')
82
+ if not os.path.isfile(ep):
83
+ continue
84
+ ret.append((dn, ep))
84
85
  return ret
85
86
 
86
87
  def installable_versions(self) -> ta.List[str]:
@@ -13,9 +13,13 @@ See (entry_points):
13
13
  # ruff: noqa: UP006 UP007
14
14
  import argparse
15
15
  import collections
16
+ import concurrent.futures as cf
16
17
  import dataclasses as dc
18
+ import functools
17
19
  import inspect
20
+ import itertools
18
21
  import json
22
+ import multiprocessing as mp
19
23
  import os.path
20
24
  import re
21
25
  import shlex
@@ -195,6 +199,7 @@ def build_module_manifests(
195
199
 
196
200
 
197
201
  def build_package_manifests(
202
+ ex: cf.Executor,
198
203
  name: str,
199
204
  base: str,
200
205
  *,
@@ -204,14 +209,20 @@ def build_package_manifests(
204
209
  if not os.path.isdir(pkg_dir) or not os.path.isfile(os.path.join(pkg_dir, '__init__.py')):
205
210
  raise Exception(pkg_dir)
206
211
 
207
- manifests: ta.List[Manifest] = []
208
-
209
- for file in sorted(findmagic.find_magic(
210
- [pkg_dir],
211
- [MANIFEST_MAGIC],
212
- ['py'],
213
- )):
214
- manifests.extend(build_module_manifests(os.path.relpath(file, base), base))
212
+ files = sorted(findmagic.find_magic(
213
+ [pkg_dir],
214
+ [MANIFEST_MAGIC],
215
+ ['py'],
216
+ ))
217
+ futs = [
218
+ ex.submit(functools.partial(
219
+ build_module_manifests,
220
+ os.path.relpath(file, base),
221
+ base,
222
+ ))
223
+ for file in files
224
+ ]
225
+ manifests: ta.List[Manifest] = list(itertools.chain.from_iterable(fut.result() for fut in futs))
215
226
 
216
227
  if write:
217
228
  with open(os.path.join(pkg_dir, '.manifests.json'), 'w') as f:
@@ -266,14 +277,22 @@ if __name__ == '__main__':
266
277
  def _gen_cmd(args) -> None:
267
278
  base = _get_base(args)
268
279
 
269
- for pkg in args.package:
270
- ms = build_package_manifests(
271
- pkg,
272
- base,
273
- write=args.write or False,
274
- )
280
+ num_threads = args.jobs or max(mp.cpu_count() // 2, 1)
281
+ with cf.ThreadPoolExecutor(num_threads) as ex:
282
+ futs = [
283
+ ex.submit(functools.partial(
284
+ build_package_manifests,
285
+ ex,
286
+ pkg,
287
+ base,
288
+ write=args.write or False,
289
+ ))
290
+ for pkg in args.package
291
+ ]
292
+ mss = [fut.result() for fut in futs]
275
293
  if not args.quiet:
276
- print(json_dumps_pretty([dc.asdict(m) for m in ms]))
294
+ for ms in mss:
295
+ print(json_dumps_pretty([dc.asdict(m) for m in ms]))
277
296
 
278
297
  def _check_cmd(args) -> None:
279
298
  base = _get_base(args)
@@ -294,6 +313,7 @@ if __name__ == '__main__':
294
313
  parser_gen.add_argument('-b', '--base')
295
314
  parser_gen.add_argument('-w', '--write', action='store_true')
296
315
  parser_gen.add_argument('-q', '--quiet', action='store_true')
316
+ parser_gen.add_argument('-j', '--jobs', type=int)
297
317
  parser_gen.add_argument('package', nargs='*')
298
318
  parser_gen.set_defaults(func=_gen_cmd)
299
319
 
@@ -8,6 +8,7 @@ import tempfile
8
8
  import typing as ta
9
9
 
10
10
  from omlish.lite.cached import cached_nullary
11
+ from omlish.lite.logs import log
11
12
 
12
13
 
13
14
  class RequirementsRewriter:
@@ -57,6 +58,7 @@ class RequirementsRewriter:
57
58
 
58
59
  with open(out_file, 'w') as f:
59
60
  f.write(''.join(out_lines))
61
+ log.info('Rewrote requirements file %s to %s', in_file, out_file)
60
62
  return out_file
61
63
 
62
64
  def rewrite(self, in_req: str, *, for_file: bool = False) -> str:
@@ -1851,11 +1851,12 @@ class Pyenv:
1851
1851
  return []
1852
1852
  ret = []
1853
1853
  vp = os.path.join(root, 'versions')
1854
- for dn in os.listdir(vp):
1855
- ep = os.path.join(vp, dn, 'bin', 'python')
1856
- if not os.path.isfile(ep):
1857
- continue
1858
- ret.append((dn, ep))
1854
+ if os.path.isdir(vp):
1855
+ for dn in os.listdir(vp):
1856
+ ep = os.path.join(vp, dn, 'bin', 'python')
1857
+ if not os.path.isfile(ep):
1858
+ continue
1859
+ ret.append((dn, ep))
1859
1860
  return ret
1860
1861
 
1861
1862
  def installable_versions(self) -> ta.List[str]:
@@ -2539,82 +2539,6 @@ class SpecifierSet(BaseSpecifier):
2539
2539
  return iter(filtered)
2540
2540
 
2541
2541
 
2542
- ########################################
2543
- # ../reqs.py
2544
- """
2545
- TODO:
2546
- - embed pip._internal.req.parse_requirements, add additional env stuff? breaks compat with raw pip
2547
- """
2548
-
2549
-
2550
- class RequirementsRewriter:
2551
- def __init__(
2552
- self,
2553
- venv: ta.Optional[str] = None,
2554
- ) -> None:
2555
- super().__init__()
2556
- self._venv = venv
2557
-
2558
- @cached_nullary
2559
- def _tmp_dir(self) -> str:
2560
- return tempfile.mkdtemp('-omlish-reqs')
2561
-
2562
- VENV_MAGIC = '# @omlish-venv'
2563
-
2564
- def rewrite_file(self, in_file: str) -> str:
2565
- with open(in_file) as f:
2566
- src = f.read()
2567
-
2568
- in_lines = src.splitlines(keepends=True)
2569
- out_lines = []
2570
-
2571
- for l in in_lines:
2572
- if self.VENV_MAGIC in l:
2573
- lp, _, rp = l.partition(self.VENV_MAGIC)
2574
- rp = rp.partition('#')[0]
2575
- omit = False
2576
- for v in rp.split():
2577
- if v[0] == '!':
2578
- if self._venv is not None and self._venv == v[1:]:
2579
- omit = True
2580
- break
2581
- else:
2582
- raise NotImplementedError
2583
-
2584
- if omit:
2585
- out_lines.append('# OMITTED: ' + l)
2586
- continue
2587
-
2588
- out_req = self.rewrite(l.rstrip('\n'), for_file=True)
2589
- out_lines.append(out_req + '\n')
2590
-
2591
- out_file = os.path.join(self._tmp_dir(), os.path.basename(in_file))
2592
- if os.path.exists(out_file):
2593
- raise Exception(f'file exists: {out_file}')
2594
-
2595
- with open(out_file, 'w') as f:
2596
- f.write(''.join(out_lines))
2597
- return out_file
2598
-
2599
- def rewrite(self, in_req: str, *, for_file: bool = False) -> str:
2600
- if in_req.strip().startswith('-r'):
2601
- l = in_req.strip()
2602
- lp, _, rp = l.partition(' ')
2603
- if lp == '-r':
2604
- inc_in_file, _, rest = rp.partition(' ')
2605
- else:
2606
- inc_in_file, rest = lp[2:], rp
2607
-
2608
- inc_out_file = self.rewrite_file(inc_in_file)
2609
- if for_file:
2610
- return ' '.join(['-r ', inc_out_file, rest])
2611
- else:
2612
- return '-r' + inc_out_file
2613
-
2614
- else:
2615
- return in_req
2616
-
2617
-
2618
2542
  ########################################
2619
2543
  # ../../../omlish/lite/logs.py
2620
2544
  """
@@ -3390,6 +3314,83 @@ class PyprojectConfigPreparer:
3390
3314
  return pcfg
3391
3315
 
3392
3316
 
3317
+ ########################################
3318
+ # ../reqs.py
3319
+ """
3320
+ TODO:
3321
+ - embed pip._internal.req.parse_requirements, add additional env stuff? breaks compat with raw pip
3322
+ """
3323
+
3324
+
3325
+ class RequirementsRewriter:
3326
+ def __init__(
3327
+ self,
3328
+ venv: ta.Optional[str] = None,
3329
+ ) -> None:
3330
+ super().__init__()
3331
+ self._venv = venv
3332
+
3333
+ @cached_nullary
3334
+ def _tmp_dir(self) -> str:
3335
+ return tempfile.mkdtemp('-omlish-reqs')
3336
+
3337
+ VENV_MAGIC = '# @omlish-venv'
3338
+
3339
+ def rewrite_file(self, in_file: str) -> str:
3340
+ with open(in_file) as f:
3341
+ src = f.read()
3342
+
3343
+ in_lines = src.splitlines(keepends=True)
3344
+ out_lines = []
3345
+
3346
+ for l in in_lines:
3347
+ if self.VENV_MAGIC in l:
3348
+ lp, _, rp = l.partition(self.VENV_MAGIC)
3349
+ rp = rp.partition('#')[0]
3350
+ omit = False
3351
+ for v in rp.split():
3352
+ if v[0] == '!':
3353
+ if self._venv is not None and self._venv == v[1:]:
3354
+ omit = True
3355
+ break
3356
+ else:
3357
+ raise NotImplementedError
3358
+
3359
+ if omit:
3360
+ out_lines.append('# OMITTED: ' + l)
3361
+ continue
3362
+
3363
+ out_req = self.rewrite(l.rstrip('\n'), for_file=True)
3364
+ out_lines.append(out_req + '\n')
3365
+
3366
+ out_file = os.path.join(self._tmp_dir(), os.path.basename(in_file))
3367
+ if os.path.exists(out_file):
3368
+ raise Exception(f'file exists: {out_file}')
3369
+
3370
+ with open(out_file, 'w') as f:
3371
+ f.write(''.join(out_lines))
3372
+ log.info('Rewrote requirements file %s to %s', in_file, out_file)
3373
+ return out_file
3374
+
3375
+ def rewrite(self, in_req: str, *, for_file: bool = False) -> str:
3376
+ if in_req.strip().startswith('-r'):
3377
+ l = in_req.strip()
3378
+ lp, _, rp = l.partition(' ')
3379
+ if lp == '-r':
3380
+ inc_in_file, _, rest = rp.partition(' ')
3381
+ else:
3382
+ inc_in_file, rest = lp[2:], rp
3383
+
3384
+ inc_out_file = self.rewrite_file(inc_in_file)
3385
+ if for_file:
3386
+ return ' '.join(['-r ', inc_out_file, rest])
3387
+ else:
3388
+ return '-r' + inc_out_file
3389
+
3390
+ else:
3391
+ return in_req
3392
+
3393
+
3393
3394
  ########################################
3394
3395
  # ../../revisions.py
3395
3396
  """
@@ -4386,11 +4387,12 @@ class Pyenv:
4386
4387
  return []
4387
4388
  ret = []
4388
4389
  vp = os.path.join(root, 'versions')
4389
- for dn in os.listdir(vp):
4390
- ep = os.path.join(vp, dn, 'bin', 'python')
4391
- if not os.path.isfile(ep):
4392
- continue
4393
- ret.append((dn, ep))
4390
+ if os.path.isdir(vp):
4391
+ for dn in os.listdir(vp):
4392
+ ep = os.path.join(vp, dn, 'bin', 'python')
4393
+ if not os.path.isfile(ep):
4394
+ continue
4395
+ ret.append((dn, ep))
4394
4396
  return ret
4395
4397
 
4396
4398
  def installable_versions(self) -> ta.List[str]:
@@ -0,0 +1,17 @@
1
+ import os.path
2
+
3
+ import yaml
4
+
5
+ from omlish import secrets as sec
6
+
7
+
8
+ SECRETS_PATH = os.getenv('SECRETS_PATH', os.path.expanduser('~/Dropbox/.dotfiles/secrets.yml'))
9
+
10
+
11
+ def load_secrets() -> sec.Secrets:
12
+ dct: dict[str, sec.Secret] = {}
13
+ with open(SECRETS_PATH) as f:
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)
@@ -0,0 +1,169 @@
1
+ import argparse
2
+ import itertools
3
+ import logging
4
+ import os.path
5
+ import typing as ta
6
+
7
+ import tokenize_rt as trt
8
+
9
+ from omlish import logs
10
+
11
+ from .. import tokens as tks
12
+ from ..cli import CliModule
13
+
14
+
15
+ T = ta.TypeVar('T')
16
+
17
+
18
+ log = logging.getLogger(__name__)
19
+
20
+
21
+ def indexfn(
22
+ fn: ta.Callable[[T], bool],
23
+ it: ta.Iterable[T],
24
+ start: int = 0,
25
+ stop: int | None = None,
26
+ step: int = 1,
27
+ ) -> int:
28
+ for i, e in enumerate(itertools.islice(it, start, stop, step)):
29
+ if fn(e):
30
+ return start + i * step
31
+ return -1
32
+
33
+
34
+ def interleave(sep: T, it: ta.Iterable[T]) -> ta.Iterable[T]:
35
+ for i, e in enumerate(it):
36
+ if i > 0:
37
+ yield sep
38
+ yield e
39
+
40
+
41
+ class Processor:
42
+ def __init__(
43
+ self,
44
+ base_dir: str,
45
+ mod_name: str | None = None,
46
+ *,
47
+ write: bool = False,
48
+ ) -> None:
49
+ super().__init__()
50
+
51
+ self._base_dir = base_dir
52
+ self._mod_name = mod_name if mod_name is not None else os.path.basename(base_dir)
53
+ self._write = write
54
+
55
+ def process_line_tks(
56
+ self,
57
+ in_tks: tks.Tokens,
58
+ src_file: str,
59
+ ) -> tks.Tokens:
60
+ lst = list(in_tks)
61
+ pfx = []
62
+ while lst and (tks.is_ws(lst[0]) or lst[0].name in ('INDENT', 'DEDENT')):
63
+ pfx.append(lst.pop(0))
64
+
65
+ if (
66
+ len(lst) < 3 or
67
+ lst[0].name != 'NAME' or
68
+ lst[0].src not in ('import', 'from') or
69
+ lst[2].name != 'NAME' or
70
+ lst[2].src != self._mod_name
71
+ ):
72
+ return in_tks
73
+
74
+ ##
75
+
76
+ ws_pos = indexfn(tks.is_ws, lst, 3)
77
+ imp_name_tks = list(lst[2:ws_pos])
78
+ imp_name_parts = [t.src for t in imp_name_tks if t.name == 'NAME']
79
+
80
+ ##
81
+
82
+ src_dir = os.path.dirname(src_file)
83
+ rel_path = os.path.relpath(os.path.join(self._base_dir, *imp_name_parts[1:]), src_dir)
84
+ rel_path_parts = rel_path.split(os.sep)
85
+ pd_pos = indexfn(lambda s: s != '..', rel_path_parts)
86
+ if pd_pos < 0:
87
+ rel_imp_name_parts = ['.' * (len(rel_path_parts) + 1)]
88
+ else:
89
+ rel_imp_name_parts = ['.' * pd_pos, *rel_path_parts[pd_pos:]]
90
+
91
+ ##
92
+
93
+ new_tks = list(interleave(
94
+ trt.Token(name='OP', src='.'),
95
+ [trt.Token(name='NAME', src=p) for p in rel_imp_name_parts],
96
+ ))
97
+ out_tks = [
98
+ *pfx,
99
+ *lst[:2],
100
+ *new_tks,
101
+ *lst[ws_pos:],
102
+ ]
103
+ return out_tks
104
+
105
+ def process_file(
106
+ self,
107
+ src_file: str,
108
+ ) -> None:
109
+ log.info('Processing file: %s : %s', self._mod_name, src_file)
110
+
111
+ with open(src_file) as f:
112
+ src = f.read()
113
+
114
+ ts = trt.src_to_tokens(src)
115
+ in_ls = tks.split_lines(ts)
116
+ out_ls = [
117
+ self.process_line_tks(
118
+ l,
119
+ src_file,
120
+ )
121
+ for l in in_ls
122
+ ]
123
+ out_src = tks.join_lines(out_ls)
124
+
125
+ if self._write:
126
+ with open(src_file, 'w') as f:
127
+ f.write(out_src)
128
+
129
+ else:
130
+ print(out_src)
131
+ print()
132
+
133
+ def process_dir(
134
+ self,
135
+ base_dir: str,
136
+ ) -> None:
137
+ for dp, _, fns in os.walk(base_dir):
138
+ for fn in fns:
139
+ if not fn.endswith('.py'):
140
+ continue
141
+
142
+ self.process_file(os.path.join(dp, fn))
143
+
144
+ def process(self) -> None:
145
+ self.process_dir(self._base_dir)
146
+
147
+
148
+ # @omlish-manifest
149
+ _CLI_MODULE = CliModule('mkrelimp', __name__)
150
+
151
+
152
+ def _main() -> None:
153
+ parser = argparse.ArgumentParser()
154
+ parser.add_argument('base_dir')
155
+ parser.add_argument('mod_name', nargs='?')
156
+ parser.add_argument('-w', '--write', action='store_true')
157
+ args = parser.parse_args()
158
+
159
+ logs.configure_standard_logging('INFO')
160
+
161
+ Processor(
162
+ args.base_dir,
163
+ args.mod_name,
164
+ write=args.write,
165
+ ).process()
166
+
167
+
168
+ if __name__ == '__main__':
169
+ _main()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omdev
3
- Version: 0.0.0.dev50
3
+ Version: 0.0.0.dev52
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.dev50
15
+ Requires-Dist: omlish==0.0.0.dev52
16
16
  Provides-Extra: all
17
17
  Requires-Dist: pycparser~=2.22; extra == "all"
18
18
  Requires-Dist: cffi~=1.17; extra == "all"
@@ -119,6 +119,7 @@ omdev/tools/__init__.py
119
119
  omdev/tools/dockertools.py
120
120
  omdev/tools/gittools.py
121
121
  omdev/tools/importscan.py
122
+ omdev/tools/mkrelimp.py
122
123
  omdev/tools/piptools.py
123
124
  omdev/tools/proftools.py
124
125
  omdev/tools/rst.py
@@ -1,4 +1,4 @@
1
- omlish==0.0.0.dev50
1
+ omlish==0.0.0.dev52
2
2
 
3
3
  [all]
4
4
  pycparser~=2.22
@@ -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.dev50'
15
+ version = '0.0.0.dev52'
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.dev50',
25
+ 'omlish == 0.0.0.dev52',
26
26
  ]
27
27
 
28
28
  [project.optional-dependencies]
@@ -73,6 +73,7 @@ exclude = [
73
73
  '*.c',
74
74
  '*.cc',
75
75
  '*.cu',
76
+ '*.g4',
76
77
  '*.h',
77
78
  '.manifests.json',
78
79
  'LICENSE',
@@ -1,12 +0,0 @@
1
- import os.path
2
- import typing as ta
3
-
4
- import yaml
5
-
6
-
7
- SECRETS_PATH = os.getenv('SECRETS_PATH', os.path.expanduser('~/Dropbox/.dotfiles/secrets.yml'))
8
-
9
-
10
- def load_secrets() -> dict[str, ta.Any]:
11
- with open(SECRETS_PATH) as f:
12
- return yaml.safe_load(f)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes