omdev 0.0.0.dev69__tar.gz → 0.0.0.dev71__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 (136) hide show
  1. {omdev-0.0.0.dev69/omdev.egg-info → omdev-0.0.0.dev71}/PKG-INFO +5 -2
  2. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/.manifests.json +25 -1
  3. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/__about__.py +4 -0
  4. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cli/managers.py +1 -1
  5. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/tools/gittools.py +50 -0
  6. omdev-0.0.0.dev71/omdev/tools/proftools.py +55 -0
  7. omdev-0.0.0.dev71/omdev/tools/rsttool.py +60 -0
  8. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71/omdev.egg-info}/PKG-INFO +5 -2
  9. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev.egg-info/SOURCES.txt +2 -2
  10. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev.egg-info/requires.txt +5 -1
  11. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/pyproject.toml +6 -2
  12. omdev-0.0.0.dev69/omdev/tools/proftools.py +0 -4
  13. omdev-0.0.0.dev69/omdev/tools/rst.py +0 -44
  14. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/LICENSE +0 -0
  15. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/MANIFEST.in +0 -0
  16. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/README.rst +0 -0
  17. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/__init__.py +0 -0
  18. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/amalg/__init__.py +0 -0
  19. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/amalg/__main__.py +0 -0
  20. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/amalg/amalg.py +0 -0
  21. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/antlr/__init__.py +0 -0
  22. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/antlr/_antlr/__init__.py +0 -0
  23. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/antlr/consts.py +0 -0
  24. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/antlr/gen.py +0 -0
  25. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/bracepy.py +0 -0
  26. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cache/__init__.py +0 -0
  27. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cache/compute/__init__.py +0 -0
  28. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cache/compute/cache.py +0 -0
  29. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cache/compute/contexts.py +0 -0
  30. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cache/compute/currents.py +0 -0
  31. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cache/compute/fns.py +0 -0
  32. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cache/compute/resolvers.py +0 -0
  33. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cache/compute/storage.py +0 -0
  34. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cache/compute/types.py +0 -0
  35. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cache/data/__init__.py +0 -0
  36. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cache/data/actions.py +0 -0
  37. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cache/data/cache.py +0 -0
  38. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cache/data/consts.py +0 -0
  39. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cache/data/defaults.py +0 -0
  40. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cache/data/manifests.py +0 -0
  41. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cache/data/specs.py +0 -0
  42. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cexts/__init__.py +0 -0
  43. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cexts/_boilerplate.cc +0 -0
  44. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cexts/_distutils/LICENSE +0 -0
  45. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cexts/_distutils/__init__.py +0 -0
  46. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cexts/_distutils/build_ext.py +0 -0
  47. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  48. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  49. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cexts/_distutils/compilers/options.py +0 -0
  50. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  51. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cexts/_distutils/dir_util.py +0 -0
  52. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cexts/_distutils/errors.py +0 -0
  53. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cexts/_distutils/extension.py +0 -0
  54. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cexts/_distutils/file_util.py +0 -0
  55. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cexts/_distutils/modified.py +0 -0
  56. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cexts/_distutils/spawn.py +0 -0
  57. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cexts/_distutils/sysconfig.py +0 -0
  58. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cexts/_distutils/util.py +0 -0
  59. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cexts/_distutils/version.py +0 -0
  60. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cexts/build.py +0 -0
  61. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cexts/cmake.py +0 -0
  62. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cexts/importhook.py +0 -0
  63. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cexts/magic.py +0 -0
  64. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cexts/scan.py +0 -0
  65. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/classdot.py +0 -0
  66. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cli/__init__.py +0 -0
  67. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cli/__main__.py +0 -0
  68. /omdev-0.0.0.dev69/omdev/cli/pathhack.py → /omdev-0.0.0.dev71/omdev/cli/_pathhack.py +0 -0
  69. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cli/clicli.py +0 -0
  70. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cli/install.py +0 -0
  71. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cli/main.py +0 -0
  72. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cli/types.py +0 -0
  73. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/cmake.py +0 -0
  74. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/findimports.py +0 -0
  75. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/findmagic.py +0 -0
  76. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/git.py +0 -0
  77. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/interp/__init__.py +0 -0
  78. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/interp/__main__.py +0 -0
  79. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/interp/cli.py +0 -0
  80. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/interp/inspect.py +0 -0
  81. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/interp/providers.py +0 -0
  82. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/interp/pyenv.py +0 -0
  83. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/interp/resolvers.py +0 -0
  84. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/interp/standalone.py +0 -0
  85. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/interp/system.py +0 -0
  86. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/interp/types.py +0 -0
  87. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/manifests/__init__.py +0 -0
  88. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/manifests/build.py +0 -0
  89. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/manifests/load.py +0 -0
  90. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/manifests/types.py +0 -0
  91. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/mypy/__init__.py +0 -0
  92. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/mypy/debug.py +0 -0
  93. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/packaging/__init__.py +0 -0
  94. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/packaging/names.py +0 -0
  95. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/packaging/requires.py +0 -0
  96. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/packaging/specifiers.py +0 -0
  97. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/packaging/versions.py +0 -0
  98. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/precheck/__init__.py +0 -0
  99. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/precheck/__main__.py +0 -0
  100. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/precheck/base.py +0 -0
  101. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/precheck/git.py +0 -0
  102. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/precheck/lite.py +0 -0
  103. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/precheck/precheck.py +0 -0
  104. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/precheck/scripts.py +0 -0
  105. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/pyproject/__init__.py +0 -0
  106. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/pyproject/__main__.py +0 -0
  107. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/pyproject/cexts.py +0 -0
  108. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/pyproject/cli.py +0 -0
  109. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/pyproject/configs.py +0 -0
  110. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/pyproject/pkg.py +0 -0
  111. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/pyproject/reqs.py +0 -0
  112. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/revisions.py +0 -0
  113. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/scripts/__init__.py +0 -0
  114. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/scripts/bumpversion.py +0 -0
  115. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/scripts/execrss.py +0 -0
  116. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/scripts/exectime.py +0 -0
  117. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/scripts/importtrace.py +0 -0
  118. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/scripts/interp.py +0 -0
  119. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/scripts/pyproject.py +0 -0
  120. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/secrets.py +0 -0
  121. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/tokens.py +0 -0
  122. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/toml/__init__.py +0 -0
  123. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/toml/parser.py +0 -0
  124. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/toml/writer.py +0 -0
  125. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/tools/__init__.py +0 -0
  126. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/tools/dockertools.py +0 -0
  127. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/tools/importscan.py +0 -0
  128. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/tools/mkrelimp.py +0 -0
  129. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/tools/nbtools.py +0 -0
  130. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/tools/piptools.py +0 -0
  131. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/tools/sqlrepl.py +0 -0
  132. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev/wheelfile.py +0 -0
  133. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev.egg-info/dependency_links.txt +0 -0
  134. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev.egg-info/entry_points.txt +0 -0
  135. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/omdev.egg-info/top_level.txt +0 -0
  136. {omdev-0.0.0.dev69 → omdev-0.0.0.dev71}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omdev
3
- Version: 0.0.0.dev69
3
+ Version: 0.0.0.dev71
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.dev69
15
+ Requires-Dist: omlish==0.0.0.dev71
16
16
  Provides-Extra: all
17
17
  Requires-Dist: black~=24.10; extra == "all"
18
18
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -20,6 +20,7 @@ Requires-Dist: cffi~=1.17; extra == "all"
20
20
  Requires-Dist: pcpp~=1.30; extra == "all"
21
21
  Requires-Dist: docutils~=0.21; extra == "all"
22
22
  Requires-Dist: mypy~=1.11; extra == "all"
23
+ Requires-Dist: gprof2dot~=2024.6; extra == "all"
23
24
  Requires-Dist: tokenize_rt~=6.0; extra == "all"
24
25
  Requires-Dist: wheel~=0.44; extra == "all"
25
26
  Provides-Extra: black
@@ -32,6 +33,8 @@ Provides-Extra: docutils
32
33
  Requires-Dist: docutils~=0.21; extra == "docutils"
33
34
  Provides-Extra: mypy
34
35
  Requires-Dist: mypy~=1.11; extra == "mypy"
36
+ Provides-Extra: prof
37
+ Requires-Dist: gprof2dot~=2024.6; extra == "prof"
35
38
  Provides-Extra: tokens
36
39
  Requires-Dist: tokenize_rt~=6.0; extra == "tokens"
37
40
  Provides-Extra: wheel
@@ -135,7 +135,7 @@
135
135
  "module": ".tools.gittools",
136
136
  "attr": "_CLI_MODULE",
137
137
  "file": "omdev/tools/gittools.py",
138
- "line": 74,
138
+ "line": 124,
139
139
  "value": {
140
140
  "$.cli.types.CliModule": {
141
141
  "cmd_name": "git",
@@ -194,6 +194,30 @@
194
194
  }
195
195
  }
196
196
  },
197
+ {
198
+ "module": ".tools.proftools",
199
+ "attr": "_CLI_MODULE",
200
+ "file": "omdev/tools/proftools.py",
201
+ "line": 50,
202
+ "value": {
203
+ "$.cli.types.CliModule": {
204
+ "cmd_name": "prof",
205
+ "mod_name": "omdev.tools.proftools"
206
+ }
207
+ }
208
+ },
209
+ {
210
+ "module": ".tools.rsttool",
211
+ "attr": "_CLI_MODULE",
212
+ "file": "omdev/tools/rsttool.py",
213
+ "line": 55,
214
+ "value": {
215
+ "$.cli.types.CliModule": {
216
+ "cmd_name": "rst",
217
+ "mod_name": "omdev.tools.rsttool"
218
+ }
219
+ }
220
+ },
197
221
  {
198
222
  "module": ".tools.sqlrepl",
199
223
  "attr": "_CLI_MODULE",
@@ -30,6 +30,10 @@ class Project(ProjectBase):
30
30
  'mypy ~= 1.11',
31
31
  ],
32
32
 
33
+ 'prof': [
34
+ 'gprof2dot ~= 2024.6',
35
+ ],
36
+
33
37
  'tokens': [
34
38
  'tokenize_rt ~= 6.0',
35
39
  ],
@@ -50,5 +50,5 @@ def setup_install_manager(cli_pkg: str) -> None:
50
50
  if detect_install_manager(cli_pkg) is None:
51
51
  return
52
52
 
53
- from .pathhack import _install_pth_file
53
+ from ._pathhack import _install_pth_file
54
54
  _install_pth_file()
@@ -4,11 +4,35 @@ import subprocess
4
4
  import urllib.parse
5
5
 
6
6
  from omlish import argparse as ap
7
+ from omlish import check
7
8
  from omlish import logs
8
9
 
9
10
  from ..cli import CliModule
10
11
 
11
12
 
13
+ def rev_parse(rev: str) -> str:
14
+ return subprocess.check_output(['git', 'rev-parse', rev]).decode().strip()
15
+
16
+
17
+ def get_first_commit_of_day(rev: str) -> str | None:
18
+ commit_date = subprocess.check_output([
19
+ 'git', 'show', '-s', '--format=%ci', rev,
20
+ ]).decode().strip().split(' ')[0]
21
+
22
+ first_commit = subprocess.check_output([
23
+ 'git', 'rev-list', '--reverse', '--max-parents=1',
24
+ '--since', f'{commit_date} 00:00:00',
25
+ '--until', f'{commit_date} 23:59:59',
26
+ rev,
27
+ ]).decode().strip().splitlines()
28
+
29
+ # Return the first commit (if there is any)
30
+ if first_commit:
31
+ return first_commit[0]
32
+ else:
33
+ return None
34
+
35
+
12
36
  class Cli(ap.Cli):
13
37
  @ap.command()
14
38
  def blob_sizes(self) -> None:
@@ -70,6 +94,32 @@ class Cli(ap.Cli):
70
94
 
71
95
  print(out_dir)
72
96
 
97
+ @ap.command(
98
+ ap.arg('rev', nargs='?', default='HEAD'),
99
+ ap.arg('-d', '--diff', action='store_true'),
100
+ ap.arg('-s', '--diff-stat', action='store_true'),
101
+ ap.arg('-g', '--github', action='store_true'),
102
+ )
103
+ def recap(self) -> None:
104
+ rev = rev_parse(self.args.rev)
105
+ day_rev = check.not_none(get_first_commit_of_day(rev))
106
+ base_rev = rev_parse(f'{day_rev}~1')
107
+
108
+ if self.args.diff or self.args.diff_stat:
109
+ os.execvp('git', ['git', 'diff', *(['--stat'] if self.args.diff_stat else []), base_rev, rev])
110
+
111
+ elif self.args.github:
112
+ rm_url = subprocess.check_output(['git', 'remote', 'get-url', 'origin']).decode('utf-8').strip()
113
+ pu = urllib.parse.urlparse(rm_url)
114
+ check.equal(pu.scheme, 'https')
115
+ check.equal(pu.hostname, 'github.com')
116
+ _, user, repo, *_ = pu.path.split('/')
117
+ gh_url = f'https://github.com/{user}/{repo}/compare/{base_rev}...{rev}'
118
+ print(gh_url)
119
+
120
+ else:
121
+ print(base_rev)
122
+
73
123
 
74
124
  # @omlish-manifest
75
125
  _CLI_MODULE = CliModule('git', __name__)
@@ -0,0 +1,55 @@
1
+ import os.path
2
+ import subprocess
3
+ import sys
4
+ import tempfile
5
+
6
+ from omlish import argparse as ap
7
+
8
+ from ..cli import CliModule
9
+
10
+
11
+ class Cli(ap.Cli):
12
+ @ap.command(
13
+ ap.arg('file'),
14
+ ap.arg('out-file', nargs='?'),
15
+ ap.arg('-w', '--write', action='store_true'),
16
+ ap.arg('-o', '--overwrite', action='store_true'),
17
+ ap.arg('-O', '--open', action='store_true'),
18
+ )
19
+ def pstats_pdf(self) -> None:
20
+ out_file = self.args.out_file
21
+ if out_file is None and self.args.write:
22
+ out_file = self.args.file + '.pdf'
23
+
24
+ if out_file is not None:
25
+ if os.path.exists(out_file) and not self.args.overwrite:
26
+ raise OSError(f'File exists: {out_file}')
27
+ else:
28
+ out_file = tempfile.mktemp(suffix=os.path.basename(self.args.file) + '.pdf') # noqa
29
+
30
+ dot = subprocess.check_output([
31
+ sys.executable,
32
+ '-m', 'gprof2dot',
33
+ '-f', 'pstats',
34
+ self.args.file,
35
+ ])
36
+
37
+ pdf = subprocess.check_output(
38
+ ['dot', '-Tpdf'],
39
+ input=dot,
40
+ )
41
+
42
+ with open(out_file, 'wb') as f:
43
+ f.write(pdf)
44
+ print(out_file)
45
+
46
+ if self.args.open:
47
+ subprocess.check_call(['open', out_file])
48
+
49
+
50
+ # @omlish-manifest
51
+ _CLI_MODULE = CliModule('prof', __name__)
52
+
53
+
54
+ if __name__ == '__main__':
55
+ Cli()()
@@ -0,0 +1,60 @@
1
+ """
2
+ TODO:
3
+ - omdev/rst.py *and* rsttool.py, when we want extracted helpers
4
+ """
5
+ import contextlib
6
+ import io
7
+ import sys
8
+
9
+ import docutils.core
10
+
11
+ from omlish import argparse as ap
12
+
13
+ from ..cli import CliModule
14
+
15
+
16
+ def rst2html(rst, report_level=None):
17
+ kwargs = {
18
+ 'writer_name': 'html',
19
+ 'settings_overrides': {
20
+ '_disable_config': True,
21
+ 'report_level': int(report_level) if report_level else 0,
22
+ },
23
+ }
24
+
25
+ target = io.StringIO()
26
+ with contextlib.redirect_stderr(target):
27
+ parts = docutils.core.publish_parts(rst, **kwargs) # type: ignore
28
+ html = parts['html_body']
29
+ warning = target.getvalue().strip()
30
+ return html, warning
31
+
32
+
33
+ class Cli(ap.Cli):
34
+ @ap.command(
35
+ ap.arg('input-file', nargs='?'),
36
+ ap.arg('--report-level', type=int),
37
+ )
38
+ def html(self) -> None:
39
+ if self.args.input_file is not None:
40
+ with open(self.args.input_file) as f:
41
+ src = f.read()
42
+ else:
43
+ src = sys.stdin.read()
44
+
45
+ html, warning = rst2html(
46
+ src,
47
+ report_level=self.args.report_level,
48
+ )
49
+
50
+ if warning:
51
+ sys.stderr.write(warning)
52
+ print(html)
53
+
54
+
55
+ # @omlish-manifest
56
+ _CLI_MODULE = CliModule('rst', __name__)
57
+
58
+
59
+ if __name__ == '__main__':
60
+ Cli().call_and_exit()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omdev
3
- Version: 0.0.0.dev69
3
+ Version: 0.0.0.dev71
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.dev69
15
+ Requires-Dist: omlish==0.0.0.dev71
16
16
  Provides-Extra: all
17
17
  Requires-Dist: black~=24.10; extra == "all"
18
18
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -20,6 +20,7 @@ Requires-Dist: cffi~=1.17; extra == "all"
20
20
  Requires-Dist: pcpp~=1.30; extra == "all"
21
21
  Requires-Dist: docutils~=0.21; extra == "all"
22
22
  Requires-Dist: mypy~=1.11; extra == "all"
23
+ Requires-Dist: gprof2dot~=2024.6; extra == "all"
23
24
  Requires-Dist: tokenize_rt~=6.0; extra == "all"
24
25
  Requires-Dist: wheel~=0.44; extra == "all"
25
26
  Provides-Extra: black
@@ -32,6 +33,8 @@ Provides-Extra: docutils
32
33
  Requires-Dist: docutils~=0.21; extra == "docutils"
33
34
  Provides-Extra: mypy
34
35
  Requires-Dist: mypy~=1.11; extra == "mypy"
36
+ Provides-Extra: prof
37
+ Requires-Dist: gprof2dot~=2024.6; extra == "prof"
35
38
  Provides-Extra: tokens
36
39
  Requires-Dist: tokenize_rt~=6.0; extra == "tokens"
37
40
  Provides-Extra: wheel
@@ -69,11 +69,11 @@ omdev/cexts/_distutils/compilers/options.py
69
69
  omdev/cexts/_distutils/compilers/unixccompiler.py
70
70
  omdev/cli/__init__.py
71
71
  omdev/cli/__main__.py
72
+ omdev/cli/_pathhack.py
72
73
  omdev/cli/clicli.py
73
74
  omdev/cli/install.py
74
75
  omdev/cli/main.py
75
76
  omdev/cli/managers.py
76
- omdev/cli/pathhack.py
77
77
  omdev/cli/types.py
78
78
  omdev/interp/__init__.py
79
79
  omdev/interp/__main__.py
@@ -128,5 +128,5 @@ omdev/tools/mkrelimp.py
128
128
  omdev/tools/nbtools.py
129
129
  omdev/tools/piptools.py
130
130
  omdev/tools/proftools.py
131
- omdev/tools/rst.py
131
+ omdev/tools/rsttool.py
132
132
  omdev/tools/sqlrepl.py
@@ -1,4 +1,4 @@
1
- omlish==0.0.0.dev69
1
+ omlish==0.0.0.dev71
2
2
 
3
3
  [all]
4
4
  black~=24.10
@@ -7,6 +7,7 @@ cffi~=1.17
7
7
  pcpp~=1.30
8
8
  docutils~=0.21
9
9
  mypy~=1.11
10
+ gprof2dot~=2024.6
10
11
  tokenize_rt~=6.0
11
12
  wheel~=0.44
12
13
 
@@ -24,6 +25,9 @@ docutils~=0.21
24
25
  [mypy]
25
26
  mypy~=1.11
26
27
 
28
+ [prof]
29
+ gprof2dot~=2024.6
30
+
27
31
  [tokens]
28
32
  tokenize_rt~=6.0
29
33
 
@@ -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.dev69'
15
+ version = '0.0.0.dev71'
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.dev69',
25
+ 'omlish == 0.0.0.dev71',
26
26
  ]
27
27
 
28
28
  [project.optional-dependencies]
@@ -33,6 +33,7 @@ all = [
33
33
  'pcpp ~= 1.30',
34
34
  'docutils ~= 0.21',
35
35
  'mypy ~= 1.11',
36
+ 'gprof2dot ~= 2024.6',
36
37
  'tokenize_rt ~= 6.0',
37
38
  'wheel ~= 0.44',
38
39
  ]
@@ -50,6 +51,9 @@ docutils = [
50
51
  mypy = [
51
52
  'mypy ~= 1.11',
52
53
  ]
54
+ prof = [
55
+ 'gprof2dot ~= 2024.6',
56
+ ]
53
57
  tokens = [
54
58
  'tokenize_rt ~= 6.0',
55
59
  ]
@@ -1,4 +0,0 @@
1
- """
2
- TODO:
3
- - rm prof.pstats.pdf ; ./python -m gprof2dot -f pstats prof.pstats | dot -Tpdf -o prof.pstats.pdf && open prof.pstats.pdf
4
- """ # noqa
@@ -1,44 +0,0 @@
1
- import argparse
2
- import contextlib
3
- import io
4
- import sys
5
-
6
- import docutils.core
7
-
8
-
9
- def rst2html(rst, report_level=None):
10
- kwargs = {
11
- 'writer_name': 'html',
12
- 'settings_overrides': {
13
- '_disable_config': True,
14
- 'report_level': int(report_level) if report_level else 0,
15
- },
16
- }
17
-
18
- target = io.StringIO()
19
- with contextlib.redirect_stderr(target):
20
- parts = docutils.core.publish_parts(rst, **kwargs) # type: ignore
21
- html = parts['html_body']
22
- warning = target.getvalue().strip()
23
- return html, warning
24
-
25
-
26
- def _main() -> None:
27
- parser = argparse.ArgumentParser()
28
- parser.add_argument('input', nargs='?')
29
- args = parser.parse_args()
30
-
31
- if args.input:
32
- with open(args.input) as f:
33
- src = f.read()
34
- else:
35
- src = sys.stdin.read()
36
-
37
- html, warning = rst2html(src)
38
- if warning:
39
- sys.stderr.write(warning)
40
- print(html)
41
-
42
-
43
- if __name__ == '__main__':
44
- _main()
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes