omdev 0.0.0.dev287__py3-none-any.whl → 0.0.0.dev289__py3-none-any.whl

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.
omdev/.manifests.json CHANGED
@@ -171,7 +171,7 @@
171
171
  "module": ".py.scripts.execstat",
172
172
  "attr": "_CLI_MODULE",
173
173
  "file": "omdev/py/scripts/execstat.py",
174
- "line": 49,
174
+ "line": 82,
175
175
  "value": {
176
176
  "$.cli.types.CliModule": {
177
177
  "cmd_name": "py/execstat",
@@ -179,18 +179,6 @@
179
179
  }
180
180
  }
181
181
  },
182
- {
183
- "module": ".py.scripts.exectime",
184
- "attr": "_CLI_MODULE",
185
- "file": "omdev/py/scripts/exectime.py",
186
- "line": 66,
187
- "value": {
188
- "$.cli.types.CliModule": {
189
- "cmd_name": "py/exectime",
190
- "mod_name": "omdev.py.scripts.exectime"
191
- }
192
- }
193
- },
194
182
  {
195
183
  "module": ".py.scripts.importtrace",
196
184
  "attr": "_CLI_MODULE",
@@ -1,7 +1,9 @@
1
1
  #!/usr/bin/env python3
2
2
  # @omlish-script
3
+ import argparse
3
4
  import inspect
4
5
  import json
6
+ import statistics
5
7
  import subprocess
6
8
  import sys
7
9
 
@@ -12,34 +14,65 @@ import sys
12
14
  def _run(
13
15
  src: str,
14
16
  *,
15
- pre: str | None = None,
17
+ setup: str | None = None,
18
+ time: bool = False,
19
+ rss: bool = False,
20
+ modules: bool = False,
16
21
  ) -> dict:
17
- import resource # noqa
18
- import sys # noqa
19
- import time # noqa
22
+ if rss:
23
+ import resource # noqa
20
24
 
21
- def get_rss() -> int:
22
- return resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
25
+ def get_rss() -> int:
26
+ return resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
23
27
 
24
- if pre:
25
- exec(pre)
28
+ if time:
29
+ from time import monotonic as get_time
26
30
 
27
- start_modules = set(sys.modules)
28
- start_rss = get_rss()
29
- start_time = time.time()
31
+ if modules:
32
+ import sys # noqa
30
33
 
31
- exec(src)
34
+ def get_modules() -> set[str]:
35
+ return set(sys.modules)
32
36
 
33
- end_time = time.time()
34
- end_rss = get_rss()
35
- end_modules = set(sys.modules)
37
+ #
38
+
39
+ if setup:
40
+ exec(setup)
41
+
42
+ code = compile(src, '', 'exec')
43
+
44
+ #
45
+
46
+ if rss:
47
+ start_rss = get_rss() # noqa
48
+
49
+ if modules:
50
+ start_modules = get_modules() # noqa
51
+
52
+ if time:
53
+ start_time = get_time() # noqa
54
+
55
+ #
56
+
57
+ exec(code)
58
+
59
+ #
60
+
61
+ if time:
62
+ end_time = get_time()
63
+
64
+ if rss:
65
+ end_rss = get_rss()
66
+
67
+ if modules:
68
+ end_modules = get_modules()
69
+
70
+ #
36
71
 
37
72
  return {
38
- 'time_ms': (time_ms := round((end_time - start_time) * 1000., 6)),
39
- 'time_ms_s': f'{time_ms:_}',
40
- 'rss': (rss := (end_rss - start_rss)),
41
- 'rss_s': f'{rss:_}',
42
- 'modules': sorted(end_modules - start_modules),
73
+ **({'time': (end_time - start_time)} if time else {}), # noqa
74
+ **({'rss': (end_rss - start_rss)} if rss else {}), # noqa
75
+ **({'modules': sorted(end_modules - start_modules)} if modules else {}), # noqa
43
76
  }
44
77
 
45
78
 
@@ -54,26 +87,91 @@ _CLI_MODULE = {'$omdev.cli.types.CliModule': {
54
87
 
55
88
 
56
89
  def _main() -> None:
57
- if len(sys.argv) == 2:
58
- pre = None
59
- [src] = sys.argv[1:]
60
- elif len(sys.argv) == 3:
61
- [pre, src] = sys.argv[1:]
62
- else:
63
- raise Exception('Invalid arguments')
64
-
65
- payload = '\n'.join([
66
- inspect.getsource(_run),
67
- f'dct = _run({src!r}, pre={pre!r})',
68
- 'import json',
69
- 'print(json.dumps(dct))',
70
- ])
71
-
72
- out_json = subprocess.check_output([sys.executable, '-c', payload])
73
-
74
- dct = json.loads(out_json)
75
-
76
- print(json.dumps(dct, indent=2))
90
+ parser = argparse.ArgumentParser()
91
+
92
+ parser.add_argument('src')
93
+ parser.add_argument('-s', '--setup')
94
+
95
+ parser.add_argument('-t', '--time', action='store_true')
96
+ parser.add_argument('-r', '--rss', action='store_true')
97
+ parser.add_argument('-m', '--modules', action='store_true')
98
+
99
+ parser.add_argument('-n', '--num-runs', type=int, default=1)
100
+
101
+ parser.add_argument('-P', '--precision', type=int, default=3)
102
+
103
+ parser.add_argument('-x', '--exe')
104
+
105
+ args = parser.parse_args()
106
+
107
+ if (n := args.num_runs) < 1:
108
+ raise ValueError('num-runs must be > 0')
109
+
110
+ prec = args.precision
111
+
112
+ #
113
+
114
+ if (exe := args.exe) is None:
115
+ exe = sys.executable
116
+
117
+ results = []
118
+ for i in range(n):
119
+ run_kw = dict(
120
+ src=args.src,
121
+ setup=args.setup,
122
+ time=bool(args.time),
123
+ )
124
+
125
+ if i == 0:
126
+ run_kw.update(
127
+ rss=bool(args.rss),
128
+ modules=bool(args.modules),
129
+ )
130
+
131
+ payload = '\n'.join([
132
+ inspect.getsource(_run),
133
+ f'dct = _run(**{run_kw!r})',
134
+ 'import json',
135
+ 'print(json.dumps(dct))',
136
+ ])
137
+
138
+ result = json.loads(subprocess.check_output([exe, '-c', payload]))
139
+
140
+ results.append(result)
141
+
142
+ #
143
+
144
+ out = {}
145
+
146
+ if args.time:
147
+ if n > 1:
148
+ ts = [r['time'] * 1000. for r in results]
149
+ out.update({
150
+ 'time_ms_mean': (time_ms_mean := round(statistics.mean(ts), prec)),
151
+ 'time_ms_mean_s': f'{time_ms_mean:_}',
152
+ 'time_ms_median': (time_ms_median := round(statistics.median(ts), prec)),
153
+ 'time_ms_median_s': f'{time_ms_median:_}',
154
+ 'time_ms_quantiles': (time_ms_quantiles := [round(tq, prec) for tq in statistics.quantiles(ts)]),
155
+ 'time_ms_quantiles_s': [f'{tq:_}' for tq in time_ms_quantiles],
156
+ })
157
+ else:
158
+ out.update({
159
+ 'time_ms': (time_ms := round(results[0]['time'] * 1000., prec)),
160
+ 'time_ms_s': f'{time_ms:_}',
161
+ })
162
+
163
+ if args.rss:
164
+ out.update({
165
+ 'rss': (rss := results[0]['rss']),
166
+ 'rss_s': f'{rss:_}',
167
+ })
168
+
169
+ if args.modules:
170
+ out.update({
171
+ 'modules': results[0]['modules'],
172
+ })
173
+
174
+ print(json.dumps(out, indent=2))
77
175
 
78
176
 
79
177
  if __name__ == '__main__':
@@ -488,20 +488,20 @@ def _main() -> None:
488
488
  import argparse
489
489
 
490
490
  parser = argparse.ArgumentParser()
491
- parser.add_argument('--python')
491
+ parser.add_argument('-x', '--exe')
492
492
  parser.add_argument('--sqlite')
493
493
  parser.add_argument('--pretty', action='store_true')
494
494
  parser.add_argument('mod')
495
495
  args = parser.parse_args()
496
496
 
497
- if args.python:
497
+ if args.exe:
498
498
  import inspect
499
499
  import subprocess
500
500
 
501
501
  mod_src = inspect.getsource(sys.modules[__name__])
502
502
  subprocess.run(
503
503
  [
504
- args.python,
504
+ args.exe,
505
505
  '-',
506
506
  *(['--sqlite', args.sqlite] if args.sqlite else []),
507
507
  *(['--pretty'] if args.pretty else []),
omdev/tools/json/cli.py CHANGED
@@ -73,8 +73,8 @@ def _build_args_parser() -> argparse.ArgumentParser:
73
73
 
74
74
  parser.add_argument('file', nargs='?')
75
75
 
76
- parser.add_argument('--stream', action='store_true')
77
- parser.add_argument('--stream-build', action='store_true')
76
+ parser.add_argument('-S', '--stream', action='store_true')
77
+ parser.add_argument('-B', '--stream-build', action='store_true')
78
78
 
79
79
  parser.add_argument('-l', '--lines', action='store_true')
80
80
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.0.dev287
3
+ Version: 0.0.0.dev289
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.dev287
15
+ Requires-Dist: omlish==0.0.0.dev289
16
16
  Provides-Extra: all
17
17
  Requires-Dist: black~=25.1; extra == "all"
18
18
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -1,4 +1,4 @@
1
- omdev/.manifests.json,sha256=qU7B38qH7pnZcSvbdlaw7Of0MoWAWncs0tG2kFVtHAc,10673
1
+ omdev/.manifests.json,sha256=zmYuVLzazV03KggE8ZqY0MlVvpEwChvCWh_wfCSEn3w,10394
2
2
  omdev/__about__.py,sha256=OgO_8azOzKriF2qPeDWRLcRe9p1XW5kYdJCq5vewff0,1171
3
3
  omdev/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  omdev/cmake.py,sha256=9rfSvFHPmKDj9ngvfDB2vK8O-xO_ZwUm7hMKLWA-yOw,4578
@@ -201,9 +201,8 @@ omdev/py/findimports.py,sha256=V3GcFhqYOiPQtAOpTi4Pmeb3_c5mKqlEwah7v9vCBjg,2476
201
201
  omdev/py/srcheaders.py,sha256=cMopJr-QpOmzEBow-4mVupxdULE8QdSaSLH2aJV5Xxg,1993
202
202
  omdev/py/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
203
203
  omdev/py/scripts/bumpversion.py,sha256=2NnfRsJiZNTg-LubIwXCm2vklG7-kIR8_xFUEZNxtiY,1119
204
- omdev/py/scripts/execstat.py,sha256=Ly11ffRdo9aud4nnxJWe5MqRsO8lDEA5L9s0Ul09hJM,1544
205
- omdev/py/scripts/exectime.py,sha256=S2O4MgtzTsFOY2IUJxsrnOIame9tEFc6aOlKP-F1JSg,1541
206
- omdev/py/scripts/importtrace.py,sha256=NjRilVNBugswrNflIhPCPHRTd-vIijqSZ8C7J8lariI,14038
204
+ omdev/py/scripts/execstat.py,sha256=eyk_TCeJt-xtMGqaW3X7pnEBe7JZbXrTYsODn_m6lfM,3869
205
+ omdev/py/scripts/importtrace.py,sha256=TqALDqR6ODpbMyAtk2q84Xrvmn0UPGaKAdcNB7E62bA,14035
207
206
  omdev/py/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
208
207
  omdev/py/tools/importscan.py,sha256=4dCH0coX0OqNwesteKaTE8GxuSfLhgXYQlzNUXLiSNY,4640
209
208
  omdev/py/tools/mkrelimp.py,sha256=L6TksQixUc_DQGXKFMOKnYJ-JixeP3ldgkDqHeEs2Ww,4044
@@ -250,7 +249,7 @@ omdev/tools/git/consts.py,sha256=JuXivUNDkNhM4pe97icjRVAKM8cNRbrODquHINNKqOE,40
250
249
  omdev/tools/git/messages.py,sha256=NWztIK0nAKJIOVzuVQcR_5LHZUgqyVkrOlpl7dFLMdU,2424
251
250
  omdev/tools/json/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
252
251
  omdev/tools/json/__main__.py,sha256=wqpkN_NsQyNwKW4qjVj8ADJ4_C98KhrFBtE-Z1UamfU,168
253
- omdev/tools/json/cli.py,sha256=EubIMT-n2XsjWBZjSy2fWXqijlwrIhLsfbkg3SZzi28,9586
252
+ omdev/tools/json/cli.py,sha256=WQ8VQ9EkGD6IeIuUci8hLPwfx6y2B8ZzFlTTizwwKXU,9598
254
253
  omdev/tools/json/formats.py,sha256=RgtPdcs294o9n9czjafHppg1iSzD-olsIc3v8ApM9Os,1908
255
254
  omdev/tools/json/io.py,sha256=sfj2hJS9Hy3aUR8a_lLzOrYcmL9fSKyvOHiofdUASsI,1427
256
255
  omdev/tools/json/parsing.py,sha256=BNCOcPs6eDvB6wePnjl9H0C-ngHxLRgzLM1EPetWnrQ,2093
@@ -259,9 +258,9 @@ omdev/tools/json/rendering.py,sha256=tMcjOW5edfozcMSTxxvF7WVTsbYLoe9bCKFh50qyaGw
259
258
  omdev/tools/pawk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
260
259
  omdev/tools/pawk/__main__.py,sha256=VCqeRVnqT1RPEoIrqHFSu4PXVMg4YEgF4qCQm90-eRI,66
261
260
  omdev/tools/pawk/pawk.py,sha256=zsEkfQX0jF5bn712uqPAyBSdJt2dno1LH2oeSMNfXQI,11424
262
- omdev-0.0.0.dev287.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
263
- omdev-0.0.0.dev287.dist-info/METADATA,sha256=c9XD3IcAQAfiAlXPY8blNR97MF-_aJaozD6n_jvhJwI,1478
264
- omdev-0.0.0.dev287.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
265
- omdev-0.0.0.dev287.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
266
- omdev-0.0.0.dev287.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
267
- omdev-0.0.0.dev287.dist-info/RECORD,,
261
+ omdev-0.0.0.dev289.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
262
+ omdev-0.0.0.dev289.dist-info/METADATA,sha256=8-HvwI8Pvm2Hg03RBIkSLRUh62utv2kbxiFn3VHiTzE,1478
263
+ omdev-0.0.0.dev289.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
264
+ omdev-0.0.0.dev289.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
265
+ omdev-0.0.0.dev289.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
266
+ omdev-0.0.0.dev289.dist-info/RECORD,,
@@ -1,106 +0,0 @@
1
- #!/usr/bin/env python3
2
- # @omlish-script
3
-
4
-
5
- ##
6
-
7
-
8
- def _run_one(src, pre=None):
9
- import time
10
-
11
- if pre:
12
- exec(pre)
13
-
14
- co = compile(src, '<string>', 'exec')
15
- start = time.time_ns()
16
- exec(co)
17
- end = time.time_ns()
18
-
19
- return end - start
20
-
21
-
22
- ##
23
-
24
-
25
- def _run(n, src, pre=None):
26
- if n is None:
27
- return _run_one(src, pre=pre)
28
-
29
- #
30
-
31
- import inspect
32
-
33
- cmd = '\n'.join([
34
- inspect.getsource(_run_one),
35
- f'print(_run_one({src!r}, pre={pre!r}))',
36
- ])
37
-
38
- #
39
-
40
- import subprocess
41
- import sys
42
-
43
- ts = []
44
- for _ in range(n):
45
- out = subprocess.check_output([sys.executable, '-c', cmd]).decode()
46
- t = int(out.strip())
47
- ts.append(t)
48
-
49
- #
50
-
51
- import statistics
52
-
53
- o = {
54
- # 'times': ts,
55
- 'mean': statistics.mean(ts),
56
- 'median': statistics.median(ts),
57
- 'quantiles': statistics.quantiles(ts),
58
- }
59
-
60
- return o
61
-
62
-
63
- ##
64
-
65
-
66
- # @omlish-manifest
67
- _CLI_MODULE = {'$omdev.cli.types.CliModule': {
68
- 'cmd_name': 'py/exectime',
69
- 'mod_name': __name__,
70
- }}
71
-
72
-
73
- def _main():
74
- import sys
75
-
76
- args = sys.argv[1:]
77
-
78
- n = None
79
- if args:
80
- try:
81
- n = int(args[0])
82
- except ValueError:
83
- pass
84
- else:
85
- args.pop(0)
86
-
87
- if len(args) > 1:
88
- pre = args.pop(0)
89
- else:
90
- pre = None
91
-
92
- if len(args) != 1:
93
- raise Exception('Invalid arguments')
94
- [src] = args
95
-
96
- #
97
-
98
- o = _run(n, src, pre=pre)
99
-
100
- import json
101
-
102
- print(json.dumps(o, indent=2))
103
-
104
-
105
- if __name__ == '__main__':
106
- _main()