omdev 0.0.0.dev9__tar.gz → 0.0.0.dev11__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.
Files changed (77) hide show
  1. {omdev-0.0.0.dev9/omdev.egg-info → omdev-0.0.0.dev11}/PKG-INFO +8 -2
  2. omdev-0.0.0.dev11/README.rst +5 -0
  3. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/exts/cmake.py +18 -5
  4. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/interp/pyenv.py +5 -1
  5. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/pyproject/cli.py +11 -6
  6. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/pyproject/pkg.py +18 -1
  7. omdev-0.0.0.dev11/omdev/scripts/bracepy.py +105 -0
  8. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/scripts/interp.py +5 -1
  9. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/scripts/pyproject.py +34 -8
  10. omdev-0.0.0.dev11/omdev/tools/gittools.py +22 -0
  11. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11/omdev.egg-info}/PKG-INFO +8 -2
  12. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev.egg-info/SOURCES.txt +2 -0
  13. omdev-0.0.0.dev11/omdev.egg-info/requires.txt +19 -0
  14. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/pyproject.toml +9 -2
  15. omdev-0.0.0.dev9/README.rst +0 -1
  16. omdev-0.0.0.dev9/omdev.egg-info/requires.txt +0 -12
  17. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/LICENSE +0 -0
  18. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/MANIFEST.in +0 -0
  19. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/__about__.py +0 -0
  20. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/__init__.py +0 -0
  21. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/amalg/__init__.py +0 -0
  22. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/amalg/__main__.py +0 -0
  23. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/amalg/amalg.py +0 -0
  24. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/classdot.py +0 -0
  25. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/cmake.py +0 -0
  26. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/exts/__init__.py +0 -0
  27. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/exts/_distutils/__init__.py +0 -0
  28. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/exts/_distutils/build_ext.py +0 -0
  29. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/exts/_distutils/compilers/__init__.py +0 -0
  30. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/exts/_distutils/compilers/ccompiler.py +0 -0
  31. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/exts/_distutils/compilers/options.py +0 -0
  32. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/exts/_distutils/compilers/unixccompiler.py +0 -0
  33. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/exts/_distutils/dir_util.py +0 -0
  34. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/exts/_distutils/errors.py +0 -0
  35. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/exts/_distutils/extension.py +0 -0
  36. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/exts/_distutils/file_util.py +0 -0
  37. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/exts/_distutils/modified.py +0 -0
  38. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/exts/_distutils/spawn.py +0 -0
  39. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/exts/_distutils/sysconfig.py +0 -0
  40. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/exts/_distutils/util.py +0 -0
  41. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/exts/_distutils/version.py +0 -0
  42. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/exts/build.py +0 -0
  43. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/exts/importhook.py +0 -0
  44. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/exts/scan.py +0 -0
  45. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/interp/__init__.py +0 -0
  46. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/interp/__main__.py +0 -0
  47. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/interp/cli.py +0 -0
  48. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/interp/inspect.py +0 -0
  49. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/interp/providers.py +0 -0
  50. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/interp/resolvers.py +0 -0
  51. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/interp/standalone.py +0 -0
  52. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/interp/system.py +0 -0
  53. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/interp/types.py +0 -0
  54. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/mypy/__init__.py +0 -0
  55. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/mypy/debug.py +0 -0
  56. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/pyproject/__init__.py +0 -0
  57. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/pyproject/__main__.py +0 -0
  58. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/pyproject/configs.py +0 -0
  59. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/pyproject/ext.py +0 -0
  60. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/scripts/__init__.py +0 -0
  61. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/scripts/execrss.py +0 -0
  62. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/scripts/findimports.py +0 -0
  63. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/scripts/findmagic.py +0 -0
  64. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/scripts/traceimport.py +0 -0
  65. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/tokens.py +0 -0
  66. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/toml/__init__.py +0 -0
  67. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/toml/parser.py +0 -0
  68. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/toml/writer.py +0 -0
  69. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/tools/__init__.py +0 -0
  70. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/tools/dockertools.py +0 -0
  71. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/tools/sqlrepl.py +0 -0
  72. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/versioning/__init__.py +0 -0
  73. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/versioning/specifiers.py +0 -0
  74. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev/versioning/versions.py +0 -0
  75. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev.egg-info/dependency_links.txt +0 -0
  76. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/omdev.egg-info/top_level.txt +0 -0
  77. {omdev-0.0.0.dev9 → omdev-0.0.0.dev11}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omdev
3
- Version: 0.0.0.dev9
3
+ Version: 0.0.0.dev11
4
4
  Summary: omdev
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -12,7 +12,13 @@ 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.dev9
15
+ Requires-Dist: omlish==0.0.0.dev11
16
+ Provides-Extra: all
17
+ Requires-Dist: pycparser>=2.22; extra == "all"
18
+ Requires-Dist: cffi>=1.17; extra == "all"
19
+ Requires-Dist: pcpp>=1.30; extra == "all"
20
+ Requires-Dist: mypy>=1.11; extra == "all"
21
+ Requires-Dist: tokenize_rt>=6; extra == "all"
16
22
  Provides-Extra: c
17
23
  Requires-Dist: pycparser>=2.22; extra == "c"
18
24
  Requires-Dist: cffi>=1.17; extra == "c"
@@ -0,0 +1,5 @@
1
+ *omlish*
2
+
3
+ Packages installable from git via:
4
+ ::
5
+ pip install 'git+https://github.com/wrmsr/omlish@master#subdirectory=.pkg/<pkg>'
@@ -18,18 +18,23 @@ Done:
18
18
 
19
19
  """ # noqa
20
20
  import io
21
+ import logging
21
22
  import os.path
22
23
  import shutil
23
24
  import sys
24
25
  import sysconfig
25
26
 
26
27
  from omlish import check
28
+ from omlish import logs
27
29
 
28
30
  from .. import cmake
29
31
 
30
32
 
33
+ log = logging.getLogger(__name__)
34
+
35
+
31
36
  def _main() -> None:
32
- # py_root = '$ENV{HOME}/.pyenv/versions/3.11.8/'
37
+ logs.configure_standard_logging('INFO')
33
38
 
34
39
  prj_root = os.path.abspath(os.getcwd())
35
40
  if not os.path.isfile(os.path.join(prj_root, 'pyproject.toml')):
@@ -51,9 +56,13 @@ def _main() -> None:
51
56
  with open(os.path.join(cmake_dir, '.gitignore'), 'w') as f:
52
57
  f.write('\n'.join(sorted(['/cmake-*', '/build'])))
53
58
 
54
- if os.path.isdir(os.path.join(cmake_dir, '.idea')):
55
- with open(os.path.join(cmake_dir, '.idea', '.name'), 'w') as f:
56
- f.write('omlish')
59
+ # idea_dir = os.path.join(cmake_dir, '.idea')
60
+ # if not os.path.isdir(idea_dir):
61
+ # os.mkdir(idea_dir)
62
+ # idea_name_file = os.path.join(idea_dir, '.name')
63
+ # if not os.path.isfile(idea_name_file):
64
+ # with open(idea_name_file, 'w') as f:
65
+ # f.write('omlish')
57
66
 
58
67
  venv_exe = sys.executable
59
68
  venv_root = os.path.abspath(os.path.join(os.path.dirname(venv_exe), '..'))
@@ -138,8 +147,12 @@ def _main() -> None:
138
147
  'omdev/exts/_boilerplate.cc',
139
148
  'x/dev/c/junk.cc',
140
149
  'x/dev/c/_uuid.cc',
150
+ 'x/dev/c/csv/_csvloader.cc',
141
151
  ]:
142
152
  ext_name = ext_src.rpartition('.')[0].replace('/', '__')
153
+
154
+ log.info('Adding cmake c extension: %s -> %s', ext_src, ext_name)
155
+
143
156
  so_name = ''.join([
144
157
  os.path.basename(ext_src).split('.')[0],
145
158
  '.',
@@ -186,7 +199,7 @@ def _main() -> None:
186
199
  ],
187
200
  ))
188
201
 
189
- print(out.getvalue())
202
+ # print(out.getvalue())
190
203
  with open(os.path.join(cmake_dir, 'CMakeLists.txt'), 'w') as f:
191
204
  f.write(out.getvalue())
192
205
 
@@ -67,8 +67,10 @@ class Pyenv:
67
67
  return os.path.join(check_not_none(self.root()), 'bin', 'pyenv')
68
68
 
69
69
  def version_exes(self) -> ta.List[ta.Tuple[str, str]]:
70
+ if (root := self.root()) is None:
71
+ return []
70
72
  ret = []
71
- vp = os.path.join(self.root(), 'versions')
73
+ vp = os.path.join(root, 'versions')
72
74
  for dn in os.listdir(vp):
73
75
  ep = os.path.join(vp, dn, 'bin', 'python')
74
76
  if not os.path.isfile(ep):
@@ -77,6 +79,8 @@ class Pyenv:
77
79
  return ret
78
80
 
79
81
  def installable_versions(self) -> ta.List[str]:
82
+ if self.root() is None:
83
+ return []
80
84
  ret = []
81
85
  s = subprocess_check_output_str(self.exe(), 'install', '--list')
82
86
  for l in s.splitlines():
@@ -26,6 +26,7 @@ import dataclasses as dc
26
26
  import functools
27
27
  import glob
28
28
  import itertools
29
+ import multiprocessing as mp
29
30
  import os.path
30
31
  import shlex
31
32
  import shutil
@@ -247,13 +248,12 @@ def _venv_cmd(args) -> None:
247
248
  )
248
249
  return
249
250
 
250
- venv.create()
251
-
252
251
  cmd = args.cmd
253
252
  if not cmd:
254
- pass
253
+ venv.create()
255
254
 
256
255
  elif cmd == 'python':
256
+ venv.create()
257
257
  os.execl(
258
258
  (exe := venv.exe()),
259
259
  exe,
@@ -261,10 +261,12 @@ def _venv_cmd(args) -> None:
261
261
  )
262
262
 
263
263
  elif cmd == 'exe':
264
+ venv.create()
264
265
  check_not(args.args)
265
266
  print(venv.exe())
266
267
 
267
268
  elif cmd == 'run':
269
+ venv.create()
268
270
  sh = check_not_none(shutil.which('bash'))
269
271
  script = ' '.join(args.args)
270
272
  if not script:
@@ -281,6 +283,7 @@ def _venv_cmd(args) -> None:
281
283
  print('\n'.join(venv.srcs()))
282
284
 
283
285
  elif cmd == 'test':
286
+ venv.create()
284
287
  subprocess_check_call(venv.exe(), '-m', 'pytest', *(args.args or []), *venv.srcs())
285
288
 
286
289
  else:
@@ -294,7 +297,10 @@ def _pkg_cmd(args) -> None:
294
297
  run = Run()
295
298
 
296
299
  cmd = args.cmd
297
- if cmd == 'gen':
300
+ if not cmd:
301
+ raise Exception('must specify command')
302
+
303
+ elif cmd == 'gen':
298
304
  build_root = os.path.join('.pkg')
299
305
 
300
306
  if os.path.exists(build_root):
@@ -303,11 +309,10 @@ def _pkg_cmd(args) -> None:
303
309
  build_output_dir = 'dist'
304
310
  run_build = bool(args.build)
305
311
 
306
- num_threads = 8
307
-
308
312
  if run_build:
309
313
  os.makedirs(build_output_dir, exist_ok=True)
310
314
 
315
+ num_threads = max(mp.cpu_count() // 2, 1)
311
316
  with cf.ThreadPoolExecutor(num_threads) as ex:
312
317
  futs = [
313
318
  ex.submit(functools.partial(
@@ -115,6 +115,8 @@ class PyprojectPackageGenerator:
115
115
  def file_contents(self) -> FileContents:
116
116
  pyp_dct = {}
117
117
 
118
+ #
119
+
118
120
  pyp_dct['build-system'] = {
119
121
  'requires': ['setuptools'],
120
122
  'build-backend': 'setuptools.build_meta',
@@ -122,14 +124,29 @@ class PyprojectPackageGenerator:
122
124
 
123
125
  prj = self._build_cls_dct(self.project_cls())
124
126
  pyp_dct['project'] = prj
125
- self._move_dict_key(prj, 'optional_dependencies', pyp_dct, 'project.optional-dependencies')
127
+
128
+ self._move_dict_key(prj, 'optional_dependencies', pyp_dct, extrask := 'project.optional-dependencies')
129
+ if (extras := pyp_dct.get(extrask)):
130
+ pyp_dct[extrask] = {
131
+ 'all': [
132
+ e
133
+ for lst in extras.values()
134
+ for e in lst
135
+ ],
136
+ **extras,
137
+ }
138
+
139
+ #
126
140
 
127
141
  st = self._build_cls_dct(self.setuptools_cls())
128
142
  pyp_dct['tool.setuptools'] = st
143
+
129
144
  self._move_dict_key(st, 'find_packages', pyp_dct, 'tool.setuptools.packages.find')
130
145
 
131
146
  mani_in = st.pop('manifest_in', None)
132
147
 
148
+ #
149
+
133
150
  return self.FileContents(
134
151
  pyp_dct,
135
152
  mani_in,
@@ -0,0 +1,105 @@
1
+ # !/usr/bin/env python3
2
+ """
3
+ https://github.com/umlet/pwk/blob/dc23b3400108a71947a695f1fa1df0f514b42528/pwk
4
+ """
5
+ import io
6
+ import tokenize
7
+
8
+
9
+ def translate_brace_python(
10
+ s: str,
11
+ *,
12
+ indent_width: int = 4,
13
+ ) -> str:
14
+ lt = tokenize.tokenize(io.BytesIO(s.encode('utf-8')).readline)
15
+
16
+ ret = io.StringIO()
17
+
18
+ indent = 0
19
+ open_braces = 0
20
+
21
+ newline = False
22
+ indent_up = False
23
+ indent_down = False
24
+ skip = False
25
+
26
+ while True:
27
+ try:
28
+ t = next(lt)
29
+
30
+ if t.type == tokenize.ENCODING:
31
+ last_t = t
32
+ continue
33
+
34
+ if t.type == tokenize.OP and t.string == ';':
35
+ newline = True
36
+
37
+ elif t.type == tokenize.OP and t.string == ':':
38
+ if open_braces == 0:
39
+ newline = True
40
+ indent_up = True
41
+
42
+ elif t.type == tokenize.OP and t.string == '{':
43
+ if last_t.type == tokenize.OP and last_t.string == ':': # noqa
44
+ skip = True
45
+ else:
46
+ open_braces += 1
47
+
48
+ elif t.type == tokenize.OP and t.string == '}':
49
+ if open_braces > 0:
50
+ open_braces -= 1
51
+ elif open_braces == 0:
52
+ if indent > 0:
53
+ newline = True
54
+ indent_down = True
55
+ skip = True
56
+ else:
57
+ raise Exception('Too many closing braces')
58
+
59
+ if indent_up:
60
+ indent += indent_width
61
+ elif indent_down:
62
+ indent -= indent_width
63
+
64
+ if newline and indent_up:
65
+ ret.write(':\n' + ' ' * indent)
66
+ elif newline:
67
+ ret.write('\n' + ' ' * indent)
68
+ elif not skip:
69
+ ret.write(t.string)
70
+ ret.write(' ')
71
+
72
+ newline = False
73
+ indent_up = False
74
+ indent_down = False
75
+ skip = False
76
+ last_t = t
77
+
78
+ except StopIteration:
79
+ break
80
+ except tokenize.TokenError:
81
+ continue
82
+
83
+ ret.write('\n')
84
+ return ret.getvalue()
85
+
86
+
87
+ def _main(argv=None) -> None:
88
+ import argparse
89
+
90
+ parser = argparse.ArgumentParser()
91
+ parser.add_argument('-x', '--exec', action='store_true')
92
+ parser.add_argument('cmd')
93
+
94
+ args = parser.parse_args(argv)
95
+
96
+ src = translate_brace_python(args.cmd)
97
+
98
+ if args.exec:
99
+ exec(src)
100
+ else:
101
+ print(src)
102
+
103
+
104
+ if __name__ == '__main__':
105
+ _main()
@@ -1669,8 +1669,10 @@ class Pyenv:
1669
1669
  return os.path.join(check_not_none(self.root()), 'bin', 'pyenv')
1670
1670
 
1671
1671
  def version_exes(self) -> ta.List[ta.Tuple[str, str]]:
1672
+ if (root := self.root()) is None:
1673
+ return []
1672
1674
  ret = []
1673
- vp = os.path.join(self.root(), 'versions')
1675
+ vp = os.path.join(root, 'versions')
1674
1676
  for dn in os.listdir(vp):
1675
1677
  ep = os.path.join(vp, dn, 'bin', 'python')
1676
1678
  if not os.path.isfile(ep):
@@ -1679,6 +1681,8 @@ class Pyenv:
1679
1681
  return ret
1680
1682
 
1681
1683
  def installable_versions(self) -> ta.List[str]:
1684
+ if self.root() is None:
1685
+ return []
1682
1686
  ret = []
1683
1687
  s = subprocess_check_output_str(self.exe(), 'install', '--list')
1684
1688
  for l in s.splitlines():
@@ -39,6 +39,7 @@ import inspect
39
39
  import itertools
40
40
  import json
41
41
  import logging
42
+ import multiprocessing as mp
42
43
  import os
43
44
  import os.path
44
45
  import re
@@ -2813,6 +2814,8 @@ class PyprojectPackageGenerator:
2813
2814
  def file_contents(self) -> FileContents:
2814
2815
  pyp_dct = {}
2815
2816
 
2817
+ #
2818
+
2816
2819
  pyp_dct['build-system'] = {
2817
2820
  'requires': ['setuptools'],
2818
2821
  'build-backend': 'setuptools.build_meta',
@@ -2820,14 +2823,29 @@ class PyprojectPackageGenerator:
2820
2823
 
2821
2824
  prj = self._build_cls_dct(self.project_cls())
2822
2825
  pyp_dct['project'] = prj
2823
- self._move_dict_key(prj, 'optional_dependencies', pyp_dct, 'project.optional-dependencies')
2826
+
2827
+ self._move_dict_key(prj, 'optional_dependencies', pyp_dct, extrask := 'project.optional-dependencies')
2828
+ if (extras := pyp_dct.get(extrask)):
2829
+ pyp_dct[extrask] = {
2830
+ 'all': [
2831
+ e
2832
+ for lst in extras.values()
2833
+ for e in lst
2834
+ ],
2835
+ **extras,
2836
+ }
2837
+
2838
+ #
2824
2839
 
2825
2840
  st = self._build_cls_dct(self.setuptools_cls())
2826
2841
  pyp_dct['tool.setuptools'] = st
2842
+
2827
2843
  self._move_dict_key(st, 'find_packages', pyp_dct, 'tool.setuptools.packages.find')
2828
2844
 
2829
2845
  mani_in = st.pop('manifest_in', None)
2830
2846
 
2847
+ #
2848
+
2831
2849
  return self.FileContents(
2832
2850
  pyp_dct,
2833
2851
  mani_in,
@@ -3208,8 +3226,10 @@ class Pyenv:
3208
3226
  return os.path.join(check_not_none(self.root()), 'bin', 'pyenv')
3209
3227
 
3210
3228
  def version_exes(self) -> ta.List[ta.Tuple[str, str]]:
3229
+ if (root := self.root()) is None:
3230
+ return []
3211
3231
  ret = []
3212
- vp = os.path.join(self.root(), 'versions')
3232
+ vp = os.path.join(root, 'versions')
3213
3233
  for dn in os.listdir(vp):
3214
3234
  ep = os.path.join(vp, dn, 'bin', 'python')
3215
3235
  if not os.path.isfile(ep):
@@ -3218,6 +3238,8 @@ class Pyenv:
3218
3238
  return ret
3219
3239
 
3220
3240
  def installable_versions(self) -> ta.List[str]:
3241
+ if self.root() is None:
3242
+ return []
3221
3243
  ret = []
3222
3244
  s = subprocess_check_output_str(self.exe(), 'install', '--list')
3223
3245
  for l in s.splitlines():
@@ -3878,13 +3900,12 @@ def _venv_cmd(args) -> None:
3878
3900
  )
3879
3901
  return
3880
3902
 
3881
- venv.create()
3882
-
3883
3903
  cmd = args.cmd
3884
3904
  if not cmd:
3885
- pass
3905
+ venv.create()
3886
3906
 
3887
3907
  elif cmd == 'python':
3908
+ venv.create()
3888
3909
  os.execl(
3889
3910
  (exe := venv.exe()),
3890
3911
  exe,
@@ -3892,10 +3913,12 @@ def _venv_cmd(args) -> None:
3892
3913
  )
3893
3914
 
3894
3915
  elif cmd == 'exe':
3916
+ venv.create()
3895
3917
  check_not(args.args)
3896
3918
  print(venv.exe())
3897
3919
 
3898
3920
  elif cmd == 'run':
3921
+ venv.create()
3899
3922
  sh = check_not_none(shutil.which('bash'))
3900
3923
  script = ' '.join(args.args)
3901
3924
  if not script:
@@ -3912,6 +3935,7 @@ def _venv_cmd(args) -> None:
3912
3935
  print('\n'.join(venv.srcs()))
3913
3936
 
3914
3937
  elif cmd == 'test':
3938
+ venv.create()
3915
3939
  subprocess_check_call(venv.exe(), '-m', 'pytest', *(args.args or []), *venv.srcs())
3916
3940
 
3917
3941
  else:
@@ -3925,7 +3949,10 @@ def _pkg_cmd(args) -> None:
3925
3949
  run = Run()
3926
3950
 
3927
3951
  cmd = args.cmd
3928
- if cmd == 'gen':
3952
+ if not cmd:
3953
+ raise Exception('must specify command')
3954
+
3955
+ elif cmd == 'gen':
3929
3956
  build_root = os.path.join('.pkg')
3930
3957
 
3931
3958
  if os.path.exists(build_root):
@@ -3934,11 +3961,10 @@ def _pkg_cmd(args) -> None:
3934
3961
  build_output_dir = 'dist'
3935
3962
  run_build = bool(args.build)
3936
3963
 
3937
- num_threads = 8
3938
-
3939
3964
  if run_build:
3940
3965
  os.makedirs(build_output_dir, exist_ok=True)
3941
3966
 
3967
+ num_threads = max(mp.cpu_count() // 2, 1)
3942
3968
  with cf.ThreadPoolExecutor(num_threads) as ex:
3943
3969
  futs = [
3944
3970
  ex.submit(functools.partial(
@@ -0,0 +1,22 @@
1
+ import subprocess
2
+
3
+ from omlish import argparse as ap
4
+ from omlish import logs
5
+
6
+
7
+ class Cli(ap.Cli):
8
+ @ap.command()
9
+ def blob_sizes(self) -> None:
10
+ # https://stackoverflow.com/a/42544963
11
+ subprocess.check_call( # noqa
12
+ "git rev-list --objects --all | "
13
+ "git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | "
14
+ "sed -n 's/^blob //p' | "
15
+ "sort --numeric-sort --key=2",
16
+ shell=True,
17
+ )
18
+
19
+
20
+ if __name__ == '__main__':
21
+ logs.configure_standard_logging('INFO')
22
+ Cli()()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omdev
3
- Version: 0.0.0.dev9
3
+ Version: 0.0.0.dev11
4
4
  Summary: omdev
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -12,7 +12,13 @@ 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.dev9
15
+ Requires-Dist: omlish==0.0.0.dev11
16
+ Provides-Extra: all
17
+ Requires-Dist: pycparser>=2.22; extra == "all"
18
+ Requires-Dist: cffi>=1.17; extra == "all"
19
+ Requires-Dist: pcpp>=1.30; extra == "all"
20
+ Requires-Dist: mypy>=1.11; extra == "all"
21
+ Requires-Dist: tokenize_rt>=6; extra == "all"
16
22
  Provides-Extra: c
17
23
  Requires-Dist: pycparser>=2.22; extra == "c"
18
24
  Requires-Dist: cffi>=1.17; extra == "c"
@@ -54,6 +54,7 @@ omdev/pyproject/configs.py
54
54
  omdev/pyproject/ext.py
55
55
  omdev/pyproject/pkg.py
56
56
  omdev/scripts/__init__.py
57
+ omdev/scripts/bracepy.py
57
58
  omdev/scripts/execrss.py
58
59
  omdev/scripts/findimports.py
59
60
  omdev/scripts/findmagic.py
@@ -65,6 +66,7 @@ omdev/toml/parser.py
65
66
  omdev/toml/writer.py
66
67
  omdev/tools/__init__.py
67
68
  omdev/tools/dockertools.py
69
+ omdev/tools/gittools.py
68
70
  omdev/tools/sqlrepl.py
69
71
  omdev/versioning/__init__.py
70
72
  omdev/versioning/specifiers.py
@@ -0,0 +1,19 @@
1
+ omlish==0.0.0.dev11
2
+
3
+ [all]
4
+ pycparser>=2.22
5
+ cffi>=1.17
6
+ pcpp>=1.30
7
+ mypy>=1.11
8
+ tokenize_rt>=6
9
+
10
+ [c]
11
+ pycparser>=2.22
12
+ cffi>=1.17
13
+ pcpp>=1.30
14
+
15
+ [mypy]
16
+ mypy>=1.11
17
+
18
+ [tokens]
19
+ tokenize_rt>=6
@@ -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.dev9'
15
+ version = '0.0.0.dev11'
16
16
  classifiers = [
17
17
  'License :: OSI Approved :: BSD License',
18
18
  'Development Status :: 2 - Pre-Alpha',
@@ -22,10 +22,17 @@ classifiers = [
22
22
  ]
23
23
  description = 'omdev'
24
24
  dependencies = [
25
- 'omlish == 0.0.0.dev9',
25
+ 'omlish == 0.0.0.dev11',
26
26
  ]
27
27
 
28
28
  [project.optional-dependencies]
29
+ all = [
30
+ 'pycparser >= 2.22',
31
+ 'cffi >= 1.17',
32
+ 'pcpp >= 1.30',
33
+ 'mypy >= 1.11',
34
+ 'tokenize_rt >= 6',
35
+ ]
29
36
  c = [
30
37
  'pycparser >= 2.22',
31
38
  'cffi >= 1.17',
@@ -1 +0,0 @@
1
- *omlish*
@@ -1,12 +0,0 @@
1
- omlish==0.0.0.dev9
2
-
3
- [c]
4
- pycparser>=2.22
5
- cffi>=1.17
6
- pcpp>=1.30
7
-
8
- [mypy]
9
- mypy>=1.11
10
-
11
- [tokens]
12
- tokenize_rt>=6
File without changes
File without changes
File without changes
File without changes
File without changes