omdev 0.0.0.dev40__tar.gz → 0.0.0.dev41__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 (125) hide show
  1. {omdev-0.0.0.dev40/omdev.egg-info → omdev-0.0.0.dev41}/PKG-INFO +2 -2
  2. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/.manifests.json +48 -0
  3. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cli/main.py +3 -0
  4. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/git.py +9 -5
  5. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/manifests/load.py +30 -14
  6. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/pyproject/cli.py +28 -15
  7. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/pyproject/pkg.py +38 -41
  8. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/scripts/execrss.py +7 -0
  9. omdev-0.0.0.dev41/omdev/scripts/exectime.py +24 -0
  10. {omdev-0.0.0.dev40/omdev/tools → omdev-0.0.0.dev41/omdev/scripts}/importtrace.py +7 -0
  11. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/scripts/pyproject.py +74 -61
  12. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/tools/importscan.py +6 -0
  13. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41/omdev.egg-info}/PKG-INFO +2 -2
  14. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev.egg-info/SOURCES.txt +2 -1
  15. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev.egg-info/requires.txt +1 -1
  16. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/pyproject.toml +2 -2
  17. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/LICENSE +0 -0
  18. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/MANIFEST.in +0 -0
  19. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/README.rst +0 -0
  20. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/__about__.py +0 -0
  21. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/__init__.py +0 -0
  22. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/amalg/__init__.py +0 -0
  23. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/amalg/__main__.py +0 -0
  24. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/amalg/amalg.py +0 -0
  25. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/bracepy.py +0 -0
  26. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cache/__init__.py +0 -0
  27. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cache/compute/__init__.py +0 -0
  28. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cache/compute/cache.py +0 -0
  29. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cache/compute/contexts.py +0 -0
  30. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cache/compute/currents.py +0 -0
  31. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cache/compute/fns.py +0 -0
  32. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cache/compute/resolvers.py +0 -0
  33. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cache/compute/storage.py +0 -0
  34. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cache/compute/types.py +0 -0
  35. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cache/data/__init__.py +0 -0
  36. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cache/data/actions.py +0 -0
  37. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cache/data/cache.py +0 -0
  38. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cache/data/consts.py +0 -0
  39. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cache/data/defaults.py +0 -0
  40. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cache/data/manifests.py +0 -0
  41. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cache/data/specs.py +0 -0
  42. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cexts/__init__.py +0 -0
  43. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cexts/_boilerplate.cc +0 -0
  44. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cexts/_distutils/LICENSE +0 -0
  45. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cexts/_distutils/__init__.py +0 -0
  46. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cexts/_distutils/build_ext.py +0 -0
  47. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  48. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  49. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cexts/_distutils/compilers/options.py +0 -0
  50. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  51. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cexts/_distutils/dir_util.py +0 -0
  52. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cexts/_distutils/errors.py +0 -0
  53. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cexts/_distutils/extension.py +0 -0
  54. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cexts/_distutils/file_util.py +0 -0
  55. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cexts/_distutils/modified.py +0 -0
  56. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cexts/_distutils/spawn.py +0 -0
  57. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cexts/_distutils/sysconfig.py +0 -0
  58. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cexts/_distutils/util.py +0 -0
  59. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cexts/_distutils/version.py +0 -0
  60. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cexts/build.py +0 -0
  61. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cexts/cmake.py +0 -0
  62. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cexts/importhook.py +0 -0
  63. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cexts/magic.py +0 -0
  64. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cexts/scan.py +0 -0
  65. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/classdot.py +0 -0
  66. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cli/__init__.py +0 -0
  67. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cli/__main__.py +0 -0
  68. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cli/install.py +0 -0
  69. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cli/types.py +0 -0
  70. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/cmake.py +0 -0
  71. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/findimports.py +0 -0
  72. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/findmagic.py +0 -0
  73. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/interp/__init__.py +0 -0
  74. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/interp/__main__.py +0 -0
  75. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/interp/cli.py +0 -0
  76. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/interp/inspect.py +0 -0
  77. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/interp/providers.py +0 -0
  78. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/interp/pyenv.py +0 -0
  79. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/interp/resolvers.py +0 -0
  80. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/interp/standalone.py +0 -0
  81. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/interp/system.py +0 -0
  82. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/interp/types.py +0 -0
  83. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/manifests/__init__.py +0 -0
  84. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/manifests/build.py +0 -0
  85. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/manifests/types.py +0 -0
  86. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/mypy/__init__.py +0 -0
  87. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/mypy/debug.py +0 -0
  88. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/packaging/__init__.py +0 -0
  89. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/packaging/names.py +0 -0
  90. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/packaging/requires.py +0 -0
  91. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/packaging/specifiers.py +0 -0
  92. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/packaging/versions.py +0 -0
  93. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/precheck/__init__.py +0 -0
  94. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/precheck/__main__.py +0 -0
  95. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/precheck/base.py +0 -0
  96. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/precheck/git.py +0 -0
  97. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/precheck/lite.py +0 -0
  98. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/precheck/precheck.py +0 -0
  99. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/precheck/scripts.py +0 -0
  100. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/pyproject/__init__.py +0 -0
  101. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/pyproject/__main__.py +0 -0
  102. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/pyproject/cexts.py +0 -0
  103. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/pyproject/configs.py +0 -0
  104. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/pyproject/reqs.py +0 -0
  105. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/revisions.py +0 -0
  106. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/scripts/__init__.py +0 -0
  107. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/scripts/bumpversion.py +0 -0
  108. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/scripts/interp.py +0 -0
  109. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/secrets.py +0 -0
  110. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/tokens.py +0 -0
  111. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/toml/__init__.py +0 -0
  112. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/toml/parser.py +0 -0
  113. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/toml/writer.py +0 -0
  114. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/tools/__init__.py +0 -0
  115. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/tools/dockertools.py +0 -0
  116. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/tools/gittools.py +0 -0
  117. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/tools/piptools.py +0 -0
  118. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/tools/proftools.py +0 -0
  119. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/tools/rst.py +0 -0
  120. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/tools/sqlrepl.py +0 -0
  121. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev/wheelfile.py +0 -0
  122. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev.egg-info/dependency_links.txt +0 -0
  123. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev.egg-info/entry_points.txt +0 -0
  124. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/omdev.egg-info/top_level.txt +0 -0
  125. {omdev-0.0.0.dev40 → omdev-0.0.0.dev41}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omdev
3
- Version: 0.0.0.dev40
3
+ Version: 0.0.0.dev41
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.dev40
15
+ Requires-Dist: omlish==0.0.0.dev41
16
16
  Provides-Extra: all
17
17
  Requires-Dist: pycparser~=2.22; extra == "all"
18
18
  Requires-Dist: cffi~=1.17; extra == "all"
@@ -71,6 +71,42 @@
71
71
  }
72
72
  }
73
73
  },
74
+ {
75
+ "module": ".scripts.execrss",
76
+ "attr": "_CLI_MODULE",
77
+ "file": "omdev/scripts/execrss.py",
78
+ "line": 11,
79
+ "value": {
80
+ "$.cli.types.CliModule": {
81
+ "cmd_name": "execrss",
82
+ "mod_name": "omdev.scripts.execrss"
83
+ }
84
+ }
85
+ },
86
+ {
87
+ "module": ".scripts.exectime",
88
+ "attr": "_CLI_MODULE",
89
+ "file": "omdev/scripts/exectime.py",
90
+ "line": 7,
91
+ "value": {
92
+ "$.cli.types.CliModule": {
93
+ "cmd_name": "exectime",
94
+ "mod_name": "omdev.scripts.exectime"
95
+ }
96
+ }
97
+ },
98
+ {
99
+ "module": ".scripts.importtrace",
100
+ "attr": "_CLI_MODULE",
101
+ "file": "omdev/scripts/importtrace.py",
102
+ "line": 481,
103
+ "value": {
104
+ "$.cli.types.CliModule": {
105
+ "cmd_name": "importtrace",
106
+ "mod_name": "omdev.scripts.importtrace"
107
+ }
108
+ }
109
+ },
74
110
  {
75
111
  "module": ".tools.dockertools",
76
112
  "attr": "_CLI_MODULE",
@@ -95,6 +131,18 @@
95
131
  }
96
132
  }
97
133
  },
134
+ {
135
+ "module": ".tools.importscan",
136
+ "attr": "_CLI_MODULE",
137
+ "file": "omdev/tools/importscan.py",
138
+ "line": 165,
139
+ "value": {
140
+ "$.cli.types.CliModule": {
141
+ "cmd_name": "importscan",
142
+ "mod_name": "omdev.tools.importscan"
143
+ }
144
+ }
145
+ },
98
146
  {
99
147
  "module": ".tools.piptools",
100
148
  "attr": "_CLI_MODULE",
@@ -1,5 +1,7 @@
1
1
  """
2
2
  TODO:
3
+ - cache ldr.discover() somehow if in uvx/pipx - very slow
4
+ - <venv-root>/.omdev-cli-manifest-cache.json - {pkg_name: manifests_json}
3
5
  - allow manually specifying manifest packages
4
6
  - https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#creating-executable-scripts
5
7
  - https://packaging.python.org/en/latest/specifications/entry-points/#entry-points
@@ -46,6 +48,7 @@ def _main() -> None:
46
48
  ldr = ManifestLoader.from_entry_point(globals())
47
49
 
48
50
  pkgs = ldr.discover()
51
+
49
52
  if not pkgs:
50
53
  pkgs = []
51
54
  for n in os.listdir(os.getcwd()):
@@ -73,11 +73,15 @@ def get_git_revision(
73
73
  if cwd is None:
74
74
  cwd = os.getcwd()
75
75
 
76
- if subprocess.run([ # noqa
77
- 'git',
78
- 'rev-parse',
79
- '--is-inside-work-tree',
80
- ], stderr=subprocess.PIPE).returncode:
76
+ if subprocess.run( # noqa
77
+ [
78
+ 'git',
79
+ 'rev-parse',
80
+ '--is-inside-work-tree',
81
+ ],
82
+ stdout=subprocess.PIPE,
83
+ stderr=subprocess.PIPE,
84
+ ).returncode:
81
85
  return None
82
86
 
83
87
  has_untracked = bool(subprocess.check_output([
@@ -1,7 +1,12 @@
1
+ """
2
+ Should be kept somewhat lightweight - used in cli entrypoints.
3
+
4
+ TODO:
5
+ - persisted caching support - {pkg_name: manifests}
6
+ """
1
7
  # ruff: noqa: UP006 UP007
2
8
  import dataclasses as dc
3
9
  import importlib.machinery
4
- import importlib.metadata
5
10
  import importlib.resources
6
11
  import json
7
12
  import typing as ta
@@ -74,19 +79,7 @@ class ManifestLoader:
74
79
  self._cls_cache[key] = cls
75
80
  return cls
76
81
 
77
- def load_raw(self, pkg_name: str) -> ta.Optional[ta.Sequence[Manifest]]:
78
- try:
79
- return self._raw_cache[pkg_name]
80
- except KeyError:
81
- pass
82
-
83
- t = importlib.resources.files(pkg_name).joinpath('.manifests.json')
84
- if not t.is_file():
85
- self._raw_cache[pkg_name] = None
86
- return None
87
-
88
- src = t.read_text('utf-8')
89
- obj = json.loads(src)
82
+ def load_contents(self, obj: ta.Any, pkg_name: str) -> ta.Sequence[Manifest]:
90
83
  if not isinstance(obj, (list, tuple)):
91
84
  raise TypeError(obj)
92
85
 
@@ -105,6 +98,26 @@ class ManifestLoader:
105
98
 
106
99
  lst.append(m)
107
100
 
101
+ return lst
102
+
103
+ def load_raw(self, pkg_name: str) -> ta.Optional[ta.Sequence[Manifest]]:
104
+ try:
105
+ return self._raw_cache[pkg_name]
106
+ except KeyError:
107
+ pass
108
+
109
+ t = importlib.resources.files(pkg_name).joinpath('.manifests.json')
110
+ if not t.is_file():
111
+ self._raw_cache[pkg_name] = None
112
+ return None
113
+
114
+ src = t.read_text('utf-8')
115
+ obj = json.loads(src)
116
+ if not isinstance(obj, (list, tuple)):
117
+ raise TypeError(obj)
118
+
119
+ lst = self.load_contents(obj, pkg_name)
120
+
108
121
  self._raw_cache[pkg_name] = lst
109
122
  return lst
110
123
 
@@ -143,6 +156,9 @@ class ManifestLoader:
143
156
  ENTRY_POINT_GROUP = 'omlish.manifests'
144
157
 
145
158
  def discover(self) -> ta.Sequence[str]:
159
+ # This is a fat dep so do it late.
160
+ import importlib.metadata
161
+
146
162
  return [
147
163
  ep.value
148
164
  for ep in importlib.metadata.entry_points(group=self.ENTRY_POINT_GROUP)
@@ -47,6 +47,7 @@ from ..toml.parser import toml_loads
47
47
  from .configs import PyprojectConfig
48
48
  from .configs import PyprojectConfigPreparer
49
49
  from .configs import VenvConfig
50
+ from .pkg import BasePyprojectPackageGenerator
50
51
  from .pkg import PyprojectPackageGenerator
51
52
  from .reqs import RequirementsRewriter
52
53
 
@@ -338,25 +339,36 @@ def _pkg_cmd(args) -> None:
338
339
  if run_build:
339
340
  os.makedirs(build_output_dir, exist_ok=True)
340
341
 
341
- num_threads = max(mp.cpu_count() // 2, 1)
342
+ pgs: ta.List[BasePyprojectPackageGenerator] = [
343
+ PyprojectPackageGenerator(
344
+ dir_name,
345
+ pkgs_root,
346
+ )
347
+ for dir_name in run.cfg().pkgs
348
+ ]
349
+ pgs = list(itertools.chain.from_iterable([pg, *pg.children()] for pg in pgs))
350
+
351
+ num_threads = args.jobs or max(mp.cpu_count() // 2, 1)
352
+ futs: ta.List[cf.Future]
342
353
  with cf.ThreadPoolExecutor(num_threads) as ex:
343
- futs = [
344
- ex.submit(functools.partial(
345
- PyprojectPackageGenerator(
346
- dir_name,
347
- pkgs_root,
348
- ).gen,
349
- PyprojectPackageGenerator.GenOpts(
350
- run_build=run_build,
351
- build_output_dir=build_output_dir,
352
- add_revision=add_revision,
353
- ),
354
- ))
355
- for dir_name in run.cfg().pkgs
356
- ]
354
+ futs = [ex.submit(pg.gen) for pg in pgs]
357
355
  for fut in futs:
358
356
  fut.result()
359
357
 
358
+ if run_build:
359
+ futs = [
360
+ ex.submit(functools.partial(
361
+ pg.build,
362
+ build_output_dir,
363
+ BasePyprojectPackageGenerator.BuildOpts(
364
+ add_revision=add_revision,
365
+ ),
366
+ ))
367
+ for pg in pgs
368
+ ]
369
+ for fut in futs:
370
+ fut.result()
371
+
360
372
  else:
361
373
  raise Exception(f'unknown subcommand: {cmd}')
362
374
 
@@ -380,6 +392,7 @@ def _build_parser() -> argparse.ArgumentParser:
380
392
  parser_resolve = subparsers.add_parser('pkg')
381
393
  parser_resolve.add_argument('-b', '--build', action='store_true')
382
394
  parser_resolve.add_argument('-r', '--revision', action='store_true')
395
+ parser_resolve.add_argument('-j', '--jobs', type=int)
383
396
  parser_resolve.add_argument('cmd', nargs='?')
384
397
  parser_resolve.add_argument('args', nargs=argparse.REMAINDER)
385
398
  parser_resolve.set_defaults(func=_pkg_cmd)
@@ -186,12 +186,33 @@ class BasePyprojectPackageGenerator(abc.ABC):
186
186
 
187
187
  #
188
188
 
189
- def _run_build(
189
+ def children(self) -> ta.Sequence['BasePyprojectPackageGenerator']:
190
+ return []
191
+
192
+ #
193
+
194
+ def gen(self) -> str:
195
+ log.info('Generating pyproject package: %s -> %s (%s)', self._dir_name, self._pkgs_root, self._pkg_suffix)
196
+
197
+ self._pkg_dir()
198
+ self._write_git_ignore()
199
+ self._symlink_source_dir()
200
+ self._write_file_contents()
201
+ self._symlink_standard_files()
202
+
203
+ return self._pkg_dir()
204
+
205
+ #
206
+
207
+ @dc.dataclass(frozen=True)
208
+ class BuildOpts:
209
+ add_revision: bool = False
210
+ test: bool = False
211
+
212
+ def build(
190
213
  self,
191
- build_output_dir: ta.Optional[str] = None,
192
- *,
193
- add_revision: bool = False,
194
- test: bool = False,
214
+ output_dir: ta.Optional[str] = None,
215
+ opts: BuildOpts = BuildOpts(),
195
216
  ) -> None:
196
217
  subprocess_check_call(
197
218
  sys.executable,
@@ -202,10 +223,10 @@ class BasePyprojectPackageGenerator(abc.ABC):
202
223
 
203
224
  dist_dir = os.path.join(self._pkg_dir(), 'dist')
204
225
 
205
- if add_revision:
226
+ if opts.add_revision:
206
227
  GitRevisionAdder().add_to(dist_dir)
207
228
 
208
- if test:
229
+ if opts.test:
209
230
  for fn in os.listdir(dist_dir):
210
231
  tmp_dir = tempfile.mkdtemp()
211
232
 
@@ -224,34 +245,9 @@ class BasePyprojectPackageGenerator(abc.ABC):
224
245
  cwd=tmp_dir,
225
246
  )
226
247
 
227
- if build_output_dir is not None:
248
+ if output_dir is not None:
228
249
  for fn in os.listdir(dist_dir):
229
- shutil.copyfile(os.path.join(dist_dir, fn), os.path.join(build_output_dir, fn))
230
-
231
- #
232
-
233
- @dc.dataclass(frozen=True)
234
- class GenOpts:
235
- run_build: bool = False
236
- build_output_dir: ta.Optional[str] = None
237
- add_revision: bool = False
238
-
239
- def gen(self, opts: GenOpts = GenOpts()) -> str:
240
- log.info('Generating pyproject package: %s -> %s (%s)', self._dir_name, self._pkgs_root, self._pkg_suffix)
241
-
242
- self._pkg_dir()
243
- self._write_git_ignore()
244
- self._symlink_source_dir()
245
- self._write_file_contents()
246
- self._symlink_standard_files()
247
-
248
- if opts.run_build:
249
- self._run_build(
250
- opts.build_output_dir,
251
- add_revision=opts.add_revision,
252
- )
253
-
254
- return self._pkg_dir()
250
+ shutil.copyfile(os.path.join(dist_dir, fn), os.path.join(output_dir, fn))
255
251
 
256
252
 
257
253
  #
@@ -377,24 +373,25 @@ class PyprojectPackageGenerator(BasePyprojectPackageGenerator):
377
373
 
378
374
  #
379
375
 
380
- def gen(self, opts: BasePyprojectPackageGenerator.GenOpts = BasePyprojectPackageGenerator.GenOpts()) -> str:
381
- ret = super().gen(opts)
376
+ @cached_nullary
377
+ def children(self) -> ta.Sequence[BasePyprojectPackageGenerator]:
378
+ out: ta.List[BasePyprojectPackageGenerator] = []
382
379
 
383
380
  if self.build_specs().setuptools.get('cexts'):
384
- _PyprojectCextPackageGenerator(
381
+ out.append(_PyprojectCextPackageGenerator(
385
382
  self._dir_name,
386
383
  self._pkgs_root,
387
384
  pkg_suffix='-cext',
388
- ).gen(opts)
385
+ ))
389
386
 
390
387
  if self.build_specs().pyproject.get('cli_scripts'):
391
- _PyprojectCliPackageGenerator(
388
+ out.append(_PyprojectCliPackageGenerator(
392
389
  self._dir_name,
393
390
  self._pkgs_root,
394
391
  pkg_suffix='-cli',
395
- ).gen(opts)
392
+ ))
396
393
 
397
- return ret
394
+ return out
398
395
 
399
396
 
400
397
  #
@@ -8,6 +8,13 @@ def _get_rss() -> int:
8
8
  return resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
9
9
 
10
10
 
11
+ # @omlish-manifest
12
+ _CLI_MODULE = {'$omdev.cli.types.CliModule': {
13
+ 'cmd_name': 'execrss',
14
+ 'mod_name': __name__,
15
+ }}
16
+
17
+
11
18
  def _main() -> None:
12
19
  [src] = sys.argv[1:]
13
20
  start = _get_rss()
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env python3
2
+ # @omlish-script
3
+ import sys
4
+ import time
5
+
6
+
7
+ # @omlish-manifest
8
+ _CLI_MODULE = {'$omdev.cli.types.CliModule': {
9
+ 'cmd_name': 'exectime',
10
+ 'mod_name': __name__,
11
+ }}
12
+
13
+
14
+ def _main() -> None:
15
+ [src] = sys.argv[1:]
16
+ co = compile(src, '<string>', 'exec')
17
+ start = time.time_ns()
18
+ exec(co)
19
+ end = time.time_ns()
20
+ print(end - start)
21
+
22
+
23
+ if __name__ == '__main__':
24
+ _main()
@@ -478,6 +478,13 @@ class SqliteWriter:
478
478
  ##
479
479
 
480
480
 
481
+ # @omlish-manifest
482
+ _CLI_MODULE = {'$omdev.cli.types.CliModule': {
483
+ 'cmd_name': 'importtrace',
484
+ 'mod_name': __name__,
485
+ }}
486
+
487
+
481
488
  def _main() -> None:
482
489
  if sys.version_info < REQUIRED_PYTHON_VERSION:
483
490
  raise EnvironmentError(f'Requires python {REQUIRED_PYTHON_VERSION}, got {sys.version_info} from {sys.executable}') # noqa
@@ -242,11 +242,15 @@ def get_git_revision(
242
242
  if cwd is None:
243
243
  cwd = os.getcwd()
244
244
 
245
- if subprocess.run([ # noqa
246
- 'git',
247
- 'rev-parse',
248
- '--is-inside-work-tree',
249
- ], stderr=subprocess.PIPE).returncode:
245
+ if subprocess.run( # noqa
246
+ [
247
+ 'git',
248
+ 'rev-parse',
249
+ '--is-inside-work-tree',
250
+ ],
251
+ stdout=subprocess.PIPE,
252
+ stderr=subprocess.PIPE,
253
+ ).returncode:
250
254
  return None
251
255
 
252
256
  has_untracked = bool(subprocess.check_output([
@@ -3879,12 +3883,33 @@ class BasePyprojectPackageGenerator(abc.ABC):
3879
3883
 
3880
3884
  #
3881
3885
 
3882
- def _run_build(
3886
+ def children(self) -> ta.Sequence['BasePyprojectPackageGenerator']:
3887
+ return []
3888
+
3889
+ #
3890
+
3891
+ def gen(self) -> str:
3892
+ log.info('Generating pyproject package: %s -> %s (%s)', self._dir_name, self._pkgs_root, self._pkg_suffix)
3893
+
3894
+ self._pkg_dir()
3895
+ self._write_git_ignore()
3896
+ self._symlink_source_dir()
3897
+ self._write_file_contents()
3898
+ self._symlink_standard_files()
3899
+
3900
+ return self._pkg_dir()
3901
+
3902
+ #
3903
+
3904
+ @dc.dataclass(frozen=True)
3905
+ class BuildOpts:
3906
+ add_revision: bool = False
3907
+ test: bool = False
3908
+
3909
+ def build(
3883
3910
  self,
3884
- build_output_dir: ta.Optional[str] = None,
3885
- *,
3886
- add_revision: bool = False,
3887
- test: bool = False,
3911
+ output_dir: ta.Optional[str] = None,
3912
+ opts: BuildOpts = BuildOpts(),
3888
3913
  ) -> None:
3889
3914
  subprocess_check_call(
3890
3915
  sys.executable,
@@ -3895,10 +3920,10 @@ class BasePyprojectPackageGenerator(abc.ABC):
3895
3920
 
3896
3921
  dist_dir = os.path.join(self._pkg_dir(), 'dist')
3897
3922
 
3898
- if add_revision:
3923
+ if opts.add_revision:
3899
3924
  GitRevisionAdder().add_to(dist_dir)
3900
3925
 
3901
- if test:
3926
+ if opts.test:
3902
3927
  for fn in os.listdir(dist_dir):
3903
3928
  tmp_dir = tempfile.mkdtemp()
3904
3929
 
@@ -3917,34 +3942,9 @@ class BasePyprojectPackageGenerator(abc.ABC):
3917
3942
  cwd=tmp_dir,
3918
3943
  )
3919
3944
 
3920
- if build_output_dir is not None:
3945
+ if output_dir is not None:
3921
3946
  for fn in os.listdir(dist_dir):
3922
- shutil.copyfile(os.path.join(dist_dir, fn), os.path.join(build_output_dir, fn))
3923
-
3924
- #
3925
-
3926
- @dc.dataclass(frozen=True)
3927
- class GenOpts:
3928
- run_build: bool = False
3929
- build_output_dir: ta.Optional[str] = None
3930
- add_revision: bool = False
3931
-
3932
- def gen(self, opts: GenOpts = GenOpts()) -> str:
3933
- log.info('Generating pyproject package: %s -> %s (%s)', self._dir_name, self._pkgs_root, self._pkg_suffix)
3934
-
3935
- self._pkg_dir()
3936
- self._write_git_ignore()
3937
- self._symlink_source_dir()
3938
- self._write_file_contents()
3939
- self._symlink_standard_files()
3940
-
3941
- if opts.run_build:
3942
- self._run_build(
3943
- opts.build_output_dir,
3944
- add_revision=opts.add_revision,
3945
- )
3946
-
3947
- return self._pkg_dir()
3947
+ shutil.copyfile(os.path.join(dist_dir, fn), os.path.join(output_dir, fn))
3948
3948
 
3949
3949
 
3950
3950
  #
@@ -4070,24 +4070,25 @@ class PyprojectPackageGenerator(BasePyprojectPackageGenerator):
4070
4070
 
4071
4071
  #
4072
4072
 
4073
- def gen(self, opts: BasePyprojectPackageGenerator.GenOpts = BasePyprojectPackageGenerator.GenOpts()) -> str:
4074
- ret = super().gen(opts)
4073
+ @cached_nullary
4074
+ def children(self) -> ta.Sequence[BasePyprojectPackageGenerator]:
4075
+ out: ta.List[BasePyprojectPackageGenerator] = []
4075
4076
 
4076
4077
  if self.build_specs().setuptools.get('cexts'):
4077
- _PyprojectCextPackageGenerator(
4078
+ out.append(_PyprojectCextPackageGenerator(
4078
4079
  self._dir_name,
4079
4080
  self._pkgs_root,
4080
4081
  pkg_suffix='-cext',
4081
- ).gen(opts)
4082
+ ))
4082
4083
 
4083
4084
  if self.build_specs().pyproject.get('cli_scripts'):
4084
- _PyprojectCliPackageGenerator(
4085
+ out.append(_PyprojectCliPackageGenerator(
4085
4086
  self._dir_name,
4086
4087
  self._pkgs_root,
4087
4088
  pkg_suffix='-cli',
4088
- ).gen(opts)
4089
+ ))
4089
4090
 
4090
- return ret
4091
+ return out
4091
4092
 
4092
4093
 
4093
4094
  #
@@ -5275,25 +5276,36 @@ def _pkg_cmd(args) -> None:
5275
5276
  if run_build:
5276
5277
  os.makedirs(build_output_dir, exist_ok=True)
5277
5278
 
5278
- num_threads = max(mp.cpu_count() // 2, 1)
5279
+ pgs: ta.List[BasePyprojectPackageGenerator] = [
5280
+ PyprojectPackageGenerator(
5281
+ dir_name,
5282
+ pkgs_root,
5283
+ )
5284
+ for dir_name in run.cfg().pkgs
5285
+ ]
5286
+ pgs = list(itertools.chain.from_iterable([pg, *pg.children()] for pg in pgs))
5287
+
5288
+ num_threads = args.jobs or max(mp.cpu_count() // 2, 1)
5289
+ futs: ta.List[cf.Future]
5279
5290
  with cf.ThreadPoolExecutor(num_threads) as ex:
5280
- futs = [
5281
- ex.submit(functools.partial(
5282
- PyprojectPackageGenerator(
5283
- dir_name,
5284
- pkgs_root,
5285
- ).gen,
5286
- PyprojectPackageGenerator.GenOpts(
5287
- run_build=run_build,
5288
- build_output_dir=build_output_dir,
5289
- add_revision=add_revision,
5290
- ),
5291
- ))
5292
- for dir_name in run.cfg().pkgs
5293
- ]
5291
+ futs = [ex.submit(pg.gen) for pg in pgs]
5294
5292
  for fut in futs:
5295
5293
  fut.result()
5296
5294
 
5295
+ if run_build:
5296
+ futs = [
5297
+ ex.submit(functools.partial(
5298
+ pg.build,
5299
+ build_output_dir,
5300
+ BasePyprojectPackageGenerator.BuildOpts(
5301
+ add_revision=add_revision,
5302
+ ),
5303
+ ))
5304
+ for pg in pgs
5305
+ ]
5306
+ for fut in futs:
5307
+ fut.result()
5308
+
5297
5309
  else:
5298
5310
  raise Exception(f'unknown subcommand: {cmd}')
5299
5311
 
@@ -5317,6 +5329,7 @@ def _build_parser() -> argparse.ArgumentParser:
5317
5329
  parser_resolve = subparsers.add_parser('pkg')
5318
5330
  parser_resolve.add_argument('-b', '--build', action='store_true')
5319
5331
  parser_resolve.add_argument('-r', '--revision', action='store_true')
5332
+ parser_resolve.add_argument('-j', '--jobs', type=int)
5320
5333
  parser_resolve.add_argument('cmd', nargs='?')
5321
5334
  parser_resolve.add_argument('args', nargs=argparse.REMAINDER)
5322
5335
  parser_resolve.set_defaults(func=_pkg_cmd)
@@ -17,6 +17,8 @@ import typing as ta
17
17
  from omlish import concurrent as cu
18
18
  from omlish import lang
19
19
 
20
+ from ..cli import CliModule
21
+
20
22
 
21
23
  ##
22
24
 
@@ -160,6 +162,10 @@ def run(
160
162
  ##
161
163
 
162
164
 
165
+ # @omlish-manifest
166
+ _CLI_MODULE = CliModule('importscan', __name__)
167
+
168
+
163
169
  def _main() -> None:
164
170
  parser = argparse.ArgumentParser()
165
171
  parser.add_argument('-j', '--jobs', type=int)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omdev
3
- Version: 0.0.0.dev40
3
+ Version: 0.0.0.dev41
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.dev40
15
+ Requires-Dist: omlish==0.0.0.dev41
16
16
  Provides-Extra: all
17
17
  Requires-Dist: pycparser~=2.22; extra == "all"
18
18
  Requires-Dist: cffi~=1.17; extra == "all"
@@ -106,6 +106,8 @@ omdev/pyproject/reqs.py
106
106
  omdev/scripts/__init__.py
107
107
  omdev/scripts/bumpversion.py
108
108
  omdev/scripts/execrss.py
109
+ omdev/scripts/exectime.py
110
+ omdev/scripts/importtrace.py
109
111
  omdev/scripts/interp.py
110
112
  omdev/scripts/pyproject.py
111
113
  omdev/toml/__init__.py
@@ -115,7 +117,6 @@ omdev/tools/__init__.py
115
117
  omdev/tools/dockertools.py
116
118
  omdev/tools/gittools.py
117
119
  omdev/tools/importscan.py
118
- omdev/tools/importtrace.py
119
120
  omdev/tools/piptools.py
120
121
  omdev/tools/proftools.py
121
122
  omdev/tools/rst.py
@@ -1,4 +1,4 @@
1
- omlish==0.0.0.dev40
1
+ omlish==0.0.0.dev41
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.dev40'
15
+ version = '0.0.0.dev41'
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.dev40',
25
+ 'omlish == 0.0.0.dev41',
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