omdev 0.0.0.dev281__py3-none-any.whl → 0.0.0.dev283__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
@@ -11,11 +11,23 @@
11
11
  }
12
12
  }
13
13
  },
14
+ {
15
+ "module": ".attrdocs",
16
+ "attr": "_CLI_MODULE",
17
+ "file": "omdev/attrdocs.py",
18
+ "line": 146,
19
+ "value": {
20
+ "$.cli.types.CliModule": {
21
+ "cmd_name": "py/attrdocs",
22
+ "mod_name": "omdev.attrdocs"
23
+ }
24
+ }
25
+ },
14
26
  {
15
27
  "module": ".bracepy",
16
28
  "attr": "_CLI_MODULE",
17
29
  "file": "omdev/bracepy.py",
18
- "line": 88,
30
+ "line": 94,
19
31
  "value": {
20
32
  "$.cli.types.CliModule": {
21
33
  "cmd_name": "bracepy",
@@ -51,7 +63,7 @@
51
63
  "module": ".classdot",
52
64
  "attr": "_CLI_MODULE",
53
65
  "file": "omdev/classdot.py",
54
- "line": 62,
66
+ "line": 65,
55
67
  "value": {
56
68
  "$.cli.types.CliModule": {
57
69
  "cmd_name": "py/classdot",
@@ -75,7 +87,7 @@
75
87
  "module": ".findimports",
76
88
  "attr": "_CLI_MODULE",
77
89
  "file": "omdev/findimports.py",
78
- "line": 81,
90
+ "line": 87,
79
91
  "value": {
80
92
  "$.cli.types.CliModule": {
81
93
  "cmd_name": "py/findimports",
@@ -87,7 +99,7 @@
87
99
  "module": ".imgur",
88
100
  "attr": "_FOO_CLI_MODULE",
89
101
  "file": "omdev/imgur.py",
90
- "line": 130,
102
+ "line": 133,
91
103
  "value": {
92
104
  "$.cli.types.CliModule": {
93
105
  "cmd_name": "imgur",
omdev/attrdocs.py ADDED
@@ -0,0 +1,177 @@
1
+ # ruff: noqa: N802
2
+ import ast
3
+ import dataclasses as dc
4
+ import inspect
5
+ import typing as ta
6
+
7
+ from omlish import check
8
+ from omlish import lang
9
+
10
+ from .tokens import all as tks
11
+
12
+
13
+ ##
14
+
15
+
16
+ @dc.dataclass(frozen=True)
17
+ class AttrDoc:
18
+ docstring: str | None = None
19
+ trailing_comment: str | None = None
20
+ preceding_comment: str | None = None
21
+
22
+ __repr__ = lang.AttrRepr.of(
23
+ 'docstring',
24
+ 'trailing_comment',
25
+ 'preceding_comment',
26
+ value_filter=bool,
27
+ )
28
+
29
+
30
+ _EMPTY_ATTR_DOC = AttrDoc()
31
+
32
+
33
+ ##
34
+
35
+
36
+ class _AttrDocAstVisitor(ast.NodeVisitor):
37
+ def __init__(
38
+ self,
39
+ *,
40
+ tok_lines: ta.Sequence[tks.Tokens] | None = None,
41
+ ) -> None:
42
+ super().__init__()
43
+
44
+ self._tok_lines = tok_lines
45
+
46
+ self._attr_docs: dict[str, AttrDoc] = {}
47
+ self._target: str | None = None
48
+ self._prev_node_type: type[ast.AST] | None = None
49
+
50
+ @property
51
+ def attr_docs(self) -> ta.Mapping[str, AttrDoc]:
52
+ return self._attr_docs
53
+
54
+ #
55
+
56
+ def visit(self, node: ast.AST) -> ta.Any:
57
+ if isinstance(node, (ast.AsyncFunctionDef, ast.FunctionDef)):
58
+ self._prev_node_type = None
59
+ return None
60
+ node_result = super().visit(node)
61
+ self._prev_node_type = type(node)
62
+ return node_result
63
+
64
+ #
65
+
66
+ @staticmethod
67
+ def _comment_tok_src(tok: tks.Token) -> str:
68
+ check.state(tok.name == 'COMMENT')
69
+ tc = tok.src
70
+ check.state(tc[0] == '#')
71
+ return tc[1:].lstrip()
72
+
73
+ def _set_target(self, node: ast.Name) -> None:
74
+ self._target = node.id
75
+
76
+ ad = _EMPTY_ATTR_DOC
77
+
78
+ if self._tok_lines is not None:
79
+ line = self._tok_lines[node.lineno - 1]
80
+ for t in reversed(line):
81
+ if t.name not in tks.WS_NAMES:
82
+ break
83
+ if t.name == 'COMMENT':
84
+ ad = dc.replace(ad, trailing_comment=self._comment_tok_src(t))
85
+ break
86
+
87
+ pll: list[str] = []
88
+ pln = node.lineno - 1
89
+ while pln > 0:
90
+ line = self._tok_lines[pln - 1]
91
+ no_ws_line = list(tks.ignore_ws(line, keep={'COMMENT'}))
92
+ if not no_ws_line or no_ws_line[0].name != 'COMMENT': # noqa
93
+ break
94
+ pll.append(self._comment_tok_src(no_ws_line[0]))
95
+ pln -= 1
96
+ if pll:
97
+ ad = dc.replace(ad, preceding_comment='\n'.join(reversed(pll)))
98
+
99
+ if ad is not _EMPTY_ATTR_DOC:
100
+ self._attr_docs[node.id] = ad
101
+
102
+ def visit_AnnAssign(self, node: ast.AnnAssign) -> ta.Any:
103
+ if isinstance(target := node.target, ast.Name):
104
+ self._set_target(target)
105
+
106
+ def visit_Assign(self, node: ast.Assign) -> ta.Any:
107
+ if len(node.targets) == 1 and isinstance(target := node.targets[0], ast.Name):
108
+ self._set_target(target) # noqa
109
+
110
+ #
111
+
112
+ def visit_Expr(self, node: ast.Expr) -> ta.Any:
113
+ if (
114
+ isinstance(node.value, ast.Constant) and
115
+ isinstance(node.value.value, str) and
116
+ self._prev_node_type in (ast.Assign, ast.AnnAssign)
117
+ ):
118
+ docstring = inspect.cleandoc(node.value.value)
119
+ if self._target:
120
+ ex = self._attr_docs.get(self._target, _EMPTY_ATTR_DOC)
121
+ check.none(ex.docstring)
122
+ self._attr_docs[self._target] = dc.replace(ex, docstring=docstring)
123
+ self._target = None
124
+
125
+
126
+ def extract_attr_docs(src: str) -> ta.Mapping[str, AttrDoc]:
127
+ if not src:
128
+ return {}
129
+
130
+ toks = tks.src_to_tokens(src)
131
+ tok_lines = tks.split_lines_dense(toks)
132
+
133
+ src_ast = ast.parse(src)
134
+
135
+ # import astpretty
136
+ # astpretty.pprint(src_ast)
137
+
138
+ ast_visitor = _AttrDocAstVisitor(tok_lines=tok_lines)
139
+ ast_visitor.visit(src_ast)
140
+ return ast_visitor.attr_docs
141
+
142
+
143
+ ##
144
+
145
+
146
+ # @omlish-manifest
147
+ _CLI_MODULE = {'$omdev.cli.types.CliModule': {
148
+ 'cmd_name': 'py/attrdocs',
149
+ 'mod_name': __name__,
150
+ }}
151
+
152
+
153
+ if __name__ == '__main__':
154
+ def _main() -> None:
155
+ import argparse
156
+
157
+ parser = argparse.ArgumentParser()
158
+ parser.add_argument('file')
159
+ args = parser.parse_args()
160
+
161
+ #
162
+
163
+ with open(args.file) as f:
164
+ src = f.read()
165
+
166
+ attr_docs = extract_attr_docs(src)
167
+
168
+ #
169
+
170
+ import json
171
+
172
+ print(json.dumps({
173
+ a: {k: v for k, v in dc.asdict(ad).items() if v}
174
+ for a, ad in sorted(attr_docs.items(), key=lambda t: t[0])
175
+ }))
176
+
177
+ _main()
omdev/bracepy.py CHANGED
@@ -7,6 +7,9 @@ import io
7
7
  import tokenize
8
8
 
9
9
 
10
+ ##
11
+
12
+
10
13
  def translate_brace_python(
11
14
  s: str,
12
15
  *,
@@ -85,6 +88,9 @@ def translate_brace_python(
85
88
  return ret.getvalue()
86
89
 
87
90
 
91
+ ##
92
+
93
+
88
94
  # @omlish-manifest
89
95
  _CLI_MODULE = {'$omdev.cli.types.CliModule': {
90
96
  'cmd_name': 'bracepy',
omdev/classdot.py CHANGED
@@ -10,6 +10,9 @@ from omlish.graphs import dot
10
10
  from .cli import CliModule
11
11
 
12
12
 
13
+ ##
14
+
15
+
13
16
  def gen_class_dot(roots: ta.Iterable[type]) -> dot.Graph:
14
17
  roots = set(roots)
15
18
  root_tup = tuple(roots)
omdev/cmake.py CHANGED
@@ -4,6 +4,9 @@ import typing as ta
4
4
  from omlish import dataclasses as dc
5
5
 
6
6
 
7
+ ##
8
+
9
+
7
10
  @dc.dataclass(frozen=True)
8
11
  class Command:
9
12
  name: str
omdev/findimports.py CHANGED
@@ -13,6 +13,9 @@ import sys
13
13
  import typing as ta
14
14
 
15
15
 
16
+ ##
17
+
18
+
16
19
  _BUILTIN_MODULE_NAMES = frozenset([*sys.builtin_module_names, *sys.stdlib_module_names])
17
20
 
18
21
 
@@ -78,6 +81,9 @@ def get_import_deps(imps: set[str]) -> set[str]:
78
81
  return {i for i in eimps if whichmod(i) != 'builtin'}
79
82
 
80
83
 
84
+ ##
85
+
86
+
81
87
  # @omlish-manifest
82
88
  _CLI_MODULE = {'$omdev.cli.types.CliModule': {
83
89
  'cmd_name': 'py/findimports',
omdev/imgur.py CHANGED
@@ -36,6 +36,9 @@ from .cli import CliModule
36
36
  from .home.secrets import load_secrets
37
37
 
38
38
 
39
+ ##
40
+
41
+
39
42
  @dc.dataclass(frozen=True)
40
43
  @msh.update_object_metadata(unknown_field='x')
41
44
  class ImageUploadData:
@@ -38,16 +38,13 @@ class PyenvInstallOpts:
38
38
 
39
39
 
40
40
  # TODO: https://github.com/pyenv/pyenv/blob/master/plugins/python-build/README.md#building-for-maximum-performance
41
- DEFAULT_PYENV_INSTALL_OPTS = PyenvInstallOpts(
41
+ _DEFAULT_PYENV_INSTALL_OPTS = PyenvInstallOpts(
42
42
  opts=[
43
43
  '-s',
44
44
  '-v',
45
45
  '-k',
46
46
  ],
47
47
  conf_opts=[
48
- # FIXME: breaks on mac for older py's
49
- '--enable-loadable-sqlite-extensions',
50
-
51
48
  # '--enable-shared',
52
49
 
53
50
  '--enable-optimizations',
@@ -63,6 +60,27 @@ DEFAULT_PYENV_INSTALL_OPTS = PyenvInstallOpts(
63
60
  ],
64
61
  )
65
62
 
63
+
64
+ def get_default_pyenv_install_opts(
65
+ version: str,
66
+ *,
67
+ platform: ta.Optional[str] = None,
68
+ ) -> PyenvInstallOpts:
69
+ if platform is None:
70
+ platform = sys.platform
71
+
72
+ opts = _DEFAULT_PYENV_INSTALL_OPTS
73
+
74
+ ma, mi = map(int, version.split('.')[:2])
75
+ if not (platform == 'darwin' and (ma, mi) < (3, 11)):
76
+ opts = dc.replace(opts, conf_opts=[
77
+ *opts.conf_opts,
78
+ '--enable-loadable-sqlite-extensions',
79
+ ])
80
+
81
+ return opts
82
+
83
+
66
84
  DEBUG_PYENV_INSTALL_OPTS = PyenvInstallOpts(opts=['-g'])
67
85
 
68
86
  THREADED_PYENV_INSTALL_OPTS = PyenvInstallOpts(conf_opts=['--disable-gil'])
@@ -188,7 +206,11 @@ class PyenvVersionInstaller:
188
206
  if opts is None:
189
207
  opts = PyenvInstallOpts()
190
208
  else:
191
- lst = [self._given_opts if self._given_opts is not None else DEFAULT_PYENV_INSTALL_OPTS]
209
+ lst: ta.List[PyenvInstallOpts] = []
210
+ if self._given_opts is not None:
211
+ lst.append(self._given_opts)
212
+ else:
213
+ lst.append(get_default_pyenv_install_opts(self._version))
192
214
  if self._interp_opts.debug:
193
215
  lst.append(DEBUG_PYENV_INSTALL_OPTS)
194
216
  if self._interp_opts.threaded:
omdev/scripts/interp.py CHANGED
@@ -4988,16 +4988,13 @@ class PyenvInstallOpts:
4988
4988
 
4989
4989
 
4990
4990
  # TODO: https://github.com/pyenv/pyenv/blob/master/plugins/python-build/README.md#building-for-maximum-performance
4991
- DEFAULT_PYENV_INSTALL_OPTS = PyenvInstallOpts(
4991
+ _DEFAULT_PYENV_INSTALL_OPTS = PyenvInstallOpts(
4992
4992
  opts=[
4993
4993
  '-s',
4994
4994
  '-v',
4995
4995
  '-k',
4996
4996
  ],
4997
4997
  conf_opts=[
4998
- # FIXME: breaks on mac for older py's
4999
- '--enable-loadable-sqlite-extensions',
5000
-
5001
4998
  # '--enable-shared',
5002
4999
 
5003
5000
  '--enable-optimizations',
@@ -5013,6 +5010,27 @@ DEFAULT_PYENV_INSTALL_OPTS = PyenvInstallOpts(
5013
5010
  ],
5014
5011
  )
5015
5012
 
5013
+
5014
+ def get_default_pyenv_install_opts(
5015
+ version: str,
5016
+ *,
5017
+ platform: ta.Optional[str] = None,
5018
+ ) -> PyenvInstallOpts:
5019
+ if platform is None:
5020
+ platform = sys.platform
5021
+
5022
+ opts = _DEFAULT_PYENV_INSTALL_OPTS
5023
+
5024
+ ma, mi = map(int, version.split('.')[:2])
5025
+ if not (platform == 'darwin' and (ma, mi) < (3, 11)):
5026
+ opts = dc.replace(opts, conf_opts=[
5027
+ *opts.conf_opts,
5028
+ '--enable-loadable-sqlite-extensions',
5029
+ ])
5030
+
5031
+ return opts
5032
+
5033
+
5016
5034
  DEBUG_PYENV_INSTALL_OPTS = PyenvInstallOpts(opts=['-g'])
5017
5035
 
5018
5036
  THREADED_PYENV_INSTALL_OPTS = PyenvInstallOpts(conf_opts=['--disable-gil'])
@@ -5138,7 +5156,11 @@ class PyenvVersionInstaller:
5138
5156
  if opts is None:
5139
5157
  opts = PyenvInstallOpts()
5140
5158
  else:
5141
- lst = [self._given_opts if self._given_opts is not None else DEFAULT_PYENV_INSTALL_OPTS]
5159
+ lst: ta.List[PyenvInstallOpts] = []
5160
+ if self._given_opts is not None:
5161
+ lst.append(self._given_opts)
5162
+ else:
5163
+ lst.append(get_default_pyenv_install_opts(self._version))
5142
5164
  if self._interp_opts.debug:
5143
5165
  lst.append(DEBUG_PYENV_INSTALL_OPTS)
5144
5166
  if self._interp_opts.threaded:
@@ -7561,16 +7561,13 @@ class PyenvInstallOpts:
7561
7561
 
7562
7562
 
7563
7563
  # TODO: https://github.com/pyenv/pyenv/blob/master/plugins/python-build/README.md#building-for-maximum-performance
7564
- DEFAULT_PYENV_INSTALL_OPTS = PyenvInstallOpts(
7564
+ _DEFAULT_PYENV_INSTALL_OPTS = PyenvInstallOpts(
7565
7565
  opts=[
7566
7566
  '-s',
7567
7567
  '-v',
7568
7568
  '-k',
7569
7569
  ],
7570
7570
  conf_opts=[
7571
- # FIXME: breaks on mac for older py's
7572
- '--enable-loadable-sqlite-extensions',
7573
-
7574
7571
  # '--enable-shared',
7575
7572
 
7576
7573
  '--enable-optimizations',
@@ -7586,6 +7583,27 @@ DEFAULT_PYENV_INSTALL_OPTS = PyenvInstallOpts(
7586
7583
  ],
7587
7584
  )
7588
7585
 
7586
+
7587
+ def get_default_pyenv_install_opts(
7588
+ version: str,
7589
+ *,
7590
+ platform: ta.Optional[str] = None,
7591
+ ) -> PyenvInstallOpts:
7592
+ if platform is None:
7593
+ platform = sys.platform
7594
+
7595
+ opts = _DEFAULT_PYENV_INSTALL_OPTS
7596
+
7597
+ ma, mi = map(int, version.split('.')[:2])
7598
+ if not (platform == 'darwin' and (ma, mi) < (3, 11)):
7599
+ opts = dc.replace(opts, conf_opts=[
7600
+ *opts.conf_opts,
7601
+ '--enable-loadable-sqlite-extensions',
7602
+ ])
7603
+
7604
+ return opts
7605
+
7606
+
7589
7607
  DEBUG_PYENV_INSTALL_OPTS = PyenvInstallOpts(opts=['-g'])
7590
7608
 
7591
7609
  THREADED_PYENV_INSTALL_OPTS = PyenvInstallOpts(conf_opts=['--disable-gil'])
@@ -7711,7 +7729,11 @@ class PyenvVersionInstaller:
7711
7729
  if opts is None:
7712
7730
  opts = PyenvInstallOpts()
7713
7731
  else:
7714
- lst = [self._given_opts if self._given_opts is not None else DEFAULT_PYENV_INSTALL_OPTS]
7732
+ lst: ta.List[PyenvInstallOpts] = []
7733
+ if self._given_opts is not None:
7734
+ lst.append(self._given_opts)
7735
+ else:
7736
+ lst.append(get_default_pyenv_install_opts(self._version))
7715
7737
  if self._interp_opts.debug:
7716
7738
  lst.append(DEBUG_PYENV_INSTALL_OPTS)
7717
7739
  if self._interp_opts.threaded:
omdev/tokens/all.py CHANGED
@@ -14,6 +14,7 @@ from .utils import ( # noqa
14
14
  ignore_ws,
15
15
 
16
16
  split_lines,
17
+ split_lines_dense,
17
18
  join_toks,
18
19
  join_lines,
19
20
 
omdev/tokens/utils.py CHANGED
@@ -42,6 +42,15 @@ def split_lines(ts: Tokens) -> list[Tokens]:
42
42
  return [list(it) for g, it in itertools.groupby(ts, lambda t: t.line)]
43
43
 
44
44
 
45
+ def split_lines_dense(ts: Tokens) -> list[Tokens]:
46
+ lines: list[list[Token]] = []
47
+ for t in ts:
48
+ while len(lines) < (t.line or 0):
49
+ lines.append([])
50
+ lines[-1].append(t)
51
+ return lines # type: ignore[return-value]
52
+
53
+
45
54
  def join_toks(ts: Tokens) -> str:
46
55
  return ''.join(t.src for t in ts)
47
56
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.0.dev281
3
+ Version: 0.0.0.dev283
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.dev281
15
+ Requires-Dist: omlish==0.0.0.dev283
16
16
  Provides-Extra: all
17
17
  Requires-Dist: black~=25.1; extra == "all"
18
18
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -1,11 +1,12 @@
1
- omdev/.manifests.json,sha256=6ctfThA3b81KIbdc0sNzL63fepwPCfqzH7uRp0edxfc,10078
1
+ omdev/.manifests.json,sha256=gpOkgx7EEYTrLPBJ-QnaUrW0fpWe9Lj6T3Wsye9wHgg,10325
2
2
  omdev/__about__.py,sha256=TeZN9riO-ekcaVodONcH5Es3OsQwWS7lu_dQHdzY_t4,1231
3
3
  omdev/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- omdev/bracepy.py,sha256=I8EdqtDvxzAi3I8TuMEW-RBfwXfqKbwp06CfOdj3L1o,2743
5
- omdev/classdot.py,sha256=YOvgy6x295I_8NKBbBlRVd3AN7Osirm_Lqt4Wj0j9rY,1631
6
- omdev/cmake.py,sha256=oBAp1K8h-iCDd9uCn-OpNpZ6n36oYFkWLIiTyQw4irU,4573
7
- omdev/findimports.py,sha256=2t8QP852saEEJFeXySEzhi_nxRSxghlkXz2jVdvy08M,2392
8
- omdev/imgur.py,sha256=Uyz8nkORlhfXXK5Sty16tX8ro8s-b7LrxjOECv4_sB0,3005
4
+ omdev/attrdocs.py,sha256=XGY87xd9FZJqzGI8V9g4sSeQMWYu7oHD_klzC8YwZhk,4528
5
+ omdev/bracepy.py,sha256=PPPoTMj4FJ5Lk3GGPEEWBGU7Kl1eCJBApSJnRvRj2Ms,2753
6
+ omdev/classdot.py,sha256=Gmw4pFEFSnm6HBz65dI5-J8hNH1BSYgH_vsMcYKzbB4,1636
7
+ omdev/cmake.py,sha256=9rfSvFHPmKDj9ngvfDB2vK8O-xO_ZwUm7hMKLWA-yOw,4578
8
+ omdev/findimports.py,sha256=CDorwWr9hdIGnV-gvYQykdiz9hEsu8JrEZAF5sD_89w,2402
9
+ omdev/imgur.py,sha256=TkjK_M4nDarEmbP-FhVkt_VzSY2jHkZnKGnhnZ1zJAs,3010
9
10
  omdev/pip.py,sha256=PqzAWDO_CbiZvXzJAZcCkFqWynUDls1jIgBWlrswQyA,2012
10
11
  omdev/tagstrings.py,sha256=zIP7nzcsZf5te0lphu6k36ND_cOvNFRg00neoTcoCs8,5484
11
12
  omdev/amalg/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -142,7 +143,7 @@ omdev/interp/providers/standalone.py,sha256=jJnncea4PIuaW-KwD2YiWDn8zTmwmsJNUKpF
142
143
  omdev/interp/providers/system.py,sha256=2HnvN70fJyolfzRSay_gJbwS2JLuURp1VOKg2oc88ts,3985
143
144
  omdev/interp/pyenv/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
144
145
  omdev/interp/pyenv/inject.py,sha256=JZCSvkLYj5x_2LWScgYVOpmPrwrYQ8YVv7OeHbcH53s,605
145
- omdev/interp/pyenv/install.py,sha256=LX5jDzQQR1X0C9OKi4masKWoMU3ms8XCfQPXS2kTZKI,7818
146
+ omdev/interp/pyenv/install.py,sha256=j9DrT7w5yZRhoDLTcZJCmhWXinXNqx0QSXwW2JabMgU,8346
146
147
  omdev/interp/pyenv/provider.py,sha256=RvPWnT5Fpj85gYxfw9o8E4kNtgvM0AcXk8_7FUk7rTs,4445
147
148
  omdev/interp/pyenv/pyenv.py,sha256=1Gt77di-lxeje9SnNYCWhYRo7CHdhTWZD0whvPanNP8,2643
148
149
  omdev/interp/uv/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -214,14 +215,14 @@ omdev/scripts/ci.py,sha256=Z2Tufq5f072q7BQzvcqBpwLkvhBaqagA7lEbeazLXMg,333891
214
215
  omdev/scripts/execrss.py,sha256=mR0G0wERBYtQmVIn63lCIIFb5zkCM6X_XOENDFYDBKc,651
215
216
  omdev/scripts/exectime.py,sha256=S2O4MgtzTsFOY2IUJxsrnOIame9tEFc6aOlKP-F1JSg,1541
216
217
  omdev/scripts/importtrace.py,sha256=NjRilVNBugswrNflIhPCPHRTd-vIijqSZ8C7J8lariI,14038
217
- omdev/scripts/interp.py,sha256=B3YviHFRbJoom4dvmGdJ7Y0LiWWpE6p1igEme4IWspU,151083
218
- omdev/scripts/pyproject.py,sha256=_WVVYRdyzgMKnuNYyjwduerjYFugZjdHgwAA-eUgCrQ,260133
218
+ omdev/scripts/interp.py,sha256=HPJQlV2PEdVCcDto3MI9SWS-LmngPGJ05jbGXMCsx3g,151611
219
+ omdev/scripts/pyproject.py,sha256=dcWEUuHsE8_zIJ26s8MMlPlFgJzlE49kVhh2sQLDlKQ,260661
219
220
  omdev/scripts/slowcat.py,sha256=lssv4yrgJHiWfOiHkUut2p8E8Tq32zB-ujXESQxFFHY,2728
220
221
  omdev/scripts/tmpexec.py,sha256=WTYcf56Tj2qjYV14AWmV8SfT0u6Y8eIU6cKgQRvEK3c,1442
221
222
  omdev/tokens/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
222
- omdev/tokens/all.py,sha256=4t_3NnU-ph_ehyC3XLB_J_lIda7KD1Xvc7rKexOVBAo,686
223
+ omdev/tokens/all.py,sha256=YT7d-jrEssJBCTC8ljVcQT7BPrCW_r1JCmE8OFzbgFg,709
223
224
  omdev/tokens/tokenizert.py,sha256=-KM5ajybESWCMtqxSm_5ktyu8s-p1MdTgYA4ungyrkM,7840
224
- omdev/tokens/utils.py,sha256=DJA2jsDzrtQxnO0bdkUk1-GmenX4ECugdhl1xOBe7QI,1448
225
+ omdev/tokens/utils.py,sha256=HN3nZhaZ0Fc7PxuUWLIMIm-l7jTh3R83-1dULkX9i2g,1698
225
226
  omdev/tools/__init__.py,sha256=iVJAOQ0viGTQOm0DLX4uZLro-9jOioYJGLg9s0kDx1A,78
226
227
  omdev/tools/cloc.py,sha256=jYlMHBae9oGKN4VKeBGuqjiQNcM2be7KIoTF0oNwx_I,5205
227
228
  omdev/tools/diff.py,sha256=_ThKWXFE-bG5SPDYNs8GqstEUPzL_PTWb03nJN0laLg,515
@@ -254,9 +255,9 @@ omdev/tools/json/rendering.py,sha256=tMcjOW5edfozcMSTxxvF7WVTsbYLoe9bCKFh50qyaGw
254
255
  omdev/tools/pawk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
255
256
  omdev/tools/pawk/__main__.py,sha256=VCqeRVnqT1RPEoIrqHFSu4PXVMg4YEgF4qCQm90-eRI,66
256
257
  omdev/tools/pawk/pawk.py,sha256=zsEkfQX0jF5bn712uqPAyBSdJt2dno1LH2oeSMNfXQI,11424
257
- omdev-0.0.0.dev281.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
258
- omdev-0.0.0.dev281.dist-info/METADATA,sha256=XM1pZMHQSxdQxvgrSv9Zn_-hAy5X2oVcbrcBJ-m8YRo,1588
259
- omdev-0.0.0.dev281.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
260
- omdev-0.0.0.dev281.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
261
- omdev-0.0.0.dev281.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
262
- omdev-0.0.0.dev281.dist-info/RECORD,,
258
+ omdev-0.0.0.dev283.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
259
+ omdev-0.0.0.dev283.dist-info/METADATA,sha256=deF-r5kF_saAx6QkRAyDHWoQQlItNcTo9ejJRCZRkyc,1588
260
+ omdev-0.0.0.dev283.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
261
+ omdev-0.0.0.dev283.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
262
+ omdev-0.0.0.dev283.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
263
+ omdev-0.0.0.dev283.dist-info/RECORD,,