omdev 0.0.0.dev486__py3-none-any.whl → 0.0.0.dev500__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.

Potentially problematic release.


This version of omdev might be problematic. Click here for more details.

Files changed (43) hide show
  1. omdev/.omlish-manifests.json +1 -1
  2. omdev/README.md +51 -0
  3. omdev/__about__.py +4 -2
  4. omdev/ci/cli.py +1 -1
  5. omdev/cli/clicli.py +37 -7
  6. omdev/dataclasses/cli.py +1 -1
  7. omdev/interp/cli.py +1 -1
  8. omdev/interp/types.py +3 -2
  9. omdev/interp/uv/provider.py +36 -0
  10. omdev/manifests/main.py +1 -1
  11. omdev/packaging/revisions.py +1 -1
  12. omdev/py/tools/pipdepup.py +150 -93
  13. omdev/pyproject/cli.py +1 -1
  14. omdev/pyproject/pkg.py +1 -1
  15. omdev/pyproject/reqs.py +8 -7
  16. omdev/pyproject/tools/aboutdeps.py +5 -0
  17. omdev/scripts/ci.py +361 -25
  18. omdev/scripts/interp.py +43 -8
  19. omdev/scripts/lib/logs.py +117 -21
  20. omdev/scripts/pyproject.py +415 -39
  21. omdev/tools/git/cli.py +43 -13
  22. omdev/tools/json/formats.py +2 -0
  23. omdev/tools/jsonview/cli.py +19 -61
  24. omdev/tools/jsonview/resources/jsonview.html.j2 +43 -0
  25. omdev/tools/pawk/README.md +195 -0
  26. omdev/tui/apps/edit/main.py +5 -1
  27. omdev/tui/apps/irc/app.py +28 -20
  28. omdev/tui/apps/irc/commands.py +1 -1
  29. omdev/tui/rich/__init__.py +12 -0
  30. omdev/tui/textual/__init__.py +41 -2
  31. omdev/tui/textual/app2.py +6 -1
  32. omdev/tui/textual/debug/__init__.py +10 -0
  33. omdev/tui/textual/debug/dominfo.py +151 -0
  34. omdev/tui/textual/debug/screen.py +24 -0
  35. omdev/tui/textual/devtools.py +187 -0
  36. omdev/tui/textual/logging2.py +20 -0
  37. omdev/tui/textual/types.py +45 -0
  38. {omdev-0.0.0.dev486.dist-info → omdev-0.0.0.dev500.dist-info}/METADATA +10 -6
  39. {omdev-0.0.0.dev486.dist-info → omdev-0.0.0.dev500.dist-info}/RECORD +43 -34
  40. {omdev-0.0.0.dev486.dist-info → omdev-0.0.0.dev500.dist-info}/WHEEL +0 -0
  41. {omdev-0.0.0.dev486.dist-info → omdev-0.0.0.dev500.dist-info}/entry_points.txt +0 -0
  42. {omdev-0.0.0.dev486.dist-info → omdev-0.0.0.dev500.dist-info}/licenses/LICENSE +0 -0
  43. {omdev-0.0.0.dev486.dist-info → omdev-0.0.0.dev500.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,151 @@
1
+ """
2
+ TODO:
3
+ - walk textual.styles.RulesMap lol
4
+ """
5
+ import typing as ta
6
+
7
+ from textual.dom import DOMNode
8
+ from textual.widget import Widget
9
+
10
+ from omlish import dataclasses as dc
11
+
12
+ from ..types import trbl_to_dict
13
+
14
+
15
+ ##
16
+
17
+
18
+ @dc.dataclass()
19
+ class DomNodeInfo:
20
+ """Representation of a Textual DOM node for debugging."""
21
+
22
+ # Identity
23
+ oid: int
24
+ oidx: str
25
+ type: str
26
+ dom_id: str | None
27
+
28
+ # CSS / Styling
29
+ classes: list[str]
30
+ pseudo_classes: list[str]
31
+ # 'styles' contains the computed values relevant to layout (margin, padding, etc)
32
+ styles: dict[str, ta.Any]
33
+
34
+ # Geometry
35
+ # Region: The actual screen space allocated (x, y, w, h)
36
+ region: dict[str, int] | None
37
+ # Virtual Size: The size the widget 'wants' to be (scrollable area)
38
+ virtual_size: dict[str, int] | None
39
+ # Content Size: The size of the content inside the padding
40
+ content_size: dict[str, int] | None
41
+
42
+ # Hierarchy
43
+ children: list['DomNodeInfo'] = dc.field(default_factory=list)
44
+
45
+
46
+ def inspect_dom_node(node: DOMNode) -> DomNodeInfo:
47
+ """
48
+ Recursively builds a tree of DomNodeInfo objects from a Textual DOM node.
49
+
50
+ Args:
51
+ node: The root node to inspect (usually app.screen or a specific widget).
52
+
53
+ Returns:
54
+ DomNodeInfo: The root of the inspected tree.
55
+ """
56
+
57
+ # 1. Identity
58
+
59
+ oid = id(node)
60
+ oidx = f'{id(node):x}'
61
+ node_type = f'{type(node).__module__}.{type(node).__qualname__}'
62
+ dom_id = node.id
63
+
64
+ # 2. Styles
65
+
66
+ # We extract specific computed styles relevant to positioning debugging. Textual 'styles' property usually returns
67
+ # the computed/effective style.
68
+ styles_info: dict[str, ta.Any] = {}
69
+
70
+ # Extract only if the node supports styles (Most DOMNodes are Widgets, but check just in case)
71
+ if isinstance(node, Widget):
72
+ s = node.styles
73
+
74
+ # Layout Rules
75
+ styles_info['display'] = str(s.display)
76
+ styles_info['position'] = str(s.position) # relative, absolute
77
+ styles_info['dock'] = str(s.dock)
78
+ styles_info['layer'] = s.layer
79
+
80
+ # Sizing Rules (The 'constraints' set in CSS)
81
+ styles_info['width_rule'] = str(s.width) # e.g. '100%', 'auto', '10'
82
+ styles_info['height_rule'] = str(s.height)
83
+ styles_info['min_width'] = str(s.min_width)
84
+ styles_info['max_width'] = str(s.max_width)
85
+ styles_info['box_sizing'] = str(s.box_sizing) # border-box vs content-box
86
+
87
+ # Spacing (Critical for debugging gaps)
88
+ styles_info['margin'] = trbl_to_dict(s.margin)
89
+ styles_info['padding'] = trbl_to_dict(s.padding)
90
+ styles_info['border'] = trbl_to_dict(s.border)
91
+
92
+ # Alignment
93
+ styles_info['align'] = f'{s.align_horizontal} {s.align_vertical}'
94
+
95
+ # 3. Geometry
96
+
97
+ # Region is the absolute coordinates on the screen (or relative to parent layer). This is "What it was forced into".
98
+ region_info: dict[str, int] | None = None
99
+ if (region := getattr(node, 'region', None)) is not None:
100
+ region_info = {
101
+ 'x': region.x,
102
+ 'y': region.y,
103
+ 'width': region.width,
104
+ 'height': region.height,
105
+ }
106
+
107
+ # Virtual size is the scrollable area. This is often "What it wants to be" (if larger than region).
108
+ virtual_info: dict[str, int] | None = None
109
+ if (virtual_size := getattr(node, 'virtual_size', None)) is not None:
110
+ virtual_info = {
111
+ 'width': virtual_size.width,
112
+ 'height': virtual_size.height,
113
+ }
114
+
115
+ content_info: dict | None = None
116
+ if isinstance(node, Widget):
117
+ # Content region is inner size (region - padding - border)
118
+ content_info = {
119
+ 'width': node.content_region.width,
120
+ 'height': node.content_region.height,
121
+ }
122
+
123
+ # 4. Recursion & Sorting
124
+
125
+ # Sort by Y position first, then X position
126
+ sorted_children = sorted(
127
+ node.children,
128
+ key=lambda n: (n.region.y, n.region.x),
129
+ )
130
+
131
+ child_nodes = [
132
+ inspect_dom_node(child)
133
+ for child in sorted_children
134
+ ]
135
+
136
+ return DomNodeInfo(
137
+ oid=oid,
138
+ oidx=oidx,
139
+ type=node_type,
140
+ dom_id=dom_id,
141
+
142
+ classes=list(node.classes),
143
+ pseudo_classes=list(node.pseudo_classes),
144
+ styles=styles_info,
145
+
146
+ region=region_info,
147
+ virtual_size=virtual_info,
148
+ content_size=content_info,
149
+
150
+ children=child_nodes,
151
+ )
@@ -0,0 +1,24 @@
1
+ from textual.geometry import Region
2
+ from textual.screen import Screen
3
+ from textual.widget import Widget
4
+
5
+
6
+ ##
7
+
8
+
9
+ def get_screen_zbuffer(screen: Screen) -> list[list[list[tuple[Widget, Region]] | None]]:
10
+ width, height = screen.size
11
+
12
+ zbuffer: list[list[list[tuple[Widget, Region]] | None]] = [
13
+ [None for _ in range(width)]
14
+ for _ in range(height)
15
+ ]
16
+
17
+ for y in range(height):
18
+ for x in range(width):
19
+ try:
20
+ zbuffer[y][x] = list(screen.get_widgets_at(x, y))
21
+ except Exception: # noqa
22
+ pass
23
+
24
+ return zbuffer
@@ -0,0 +1,187 @@
1
+ # ruff: noqa: UP037 UP045
2
+ import inspect
3
+ import logging
4
+ import typing as ta
5
+
6
+ import textual.constants
7
+
8
+ from omlish import check
9
+ from omlish import dataclasses as dc
10
+ from omlish import lang
11
+
12
+ from .logging2 import translate_log_level
13
+
14
+
15
+ with lang.auto_proxy_import(globals()):
16
+ from textual_dev import client as tx_dev_client
17
+ from textual_dev import redirect_output as tx_dev_redirect_output
18
+
19
+
20
+ ##
21
+
22
+
23
+ @dc.dataclass(frozen=True, kw_only=True)
24
+ class DevtoolsConfig:
25
+ host: str = '127.0.0.1'
26
+
27
+ # https://github.com/Textualize/textual/blob/676045381b7178c3bc94b86901f20764e08aca49/src/textual/constants.py#L125
28
+ port: int = 8081
29
+
30
+ @classmethod
31
+ def from_env(cls) -> 'DevtoolsConfig':
32
+ return cls(
33
+ host=textual.constants.DEVTOOLS_HOST,
34
+ port=textual.constants.DEVTOOLS_PORT,
35
+ )
36
+
37
+
38
+ async def connect_devtools(config: DevtoolsConfig) -> ta.Optional['tx_dev_client.DevtoolsClient']:
39
+ try:
40
+ from textual_dev.client import DevtoolsClient # noqa
41
+ except ImportError:
42
+ # Dev dependencies not installed
43
+ return None
44
+
45
+ devtools = DevtoolsClient(
46
+ config.host,
47
+ config.port,
48
+ )
49
+
50
+ from textual_dev.client import DevtoolsConnectionError
51
+
52
+ try:
53
+ await devtools.connect()
54
+ except DevtoolsConnectionError as e: # noqa
55
+ return None
56
+
57
+ return devtools
58
+
59
+
60
+ ##
61
+
62
+
63
+ class DevtoolsAppMixin:
64
+ _skip_devtools_management: bool = False
65
+
66
+ def _install_devtools(self, devtools: 'tx_dev_client.DevtoolsClient') -> None:
67
+ check.none(getattr(self, 'devtools', None))
68
+ check.none(getattr(self, '_devtools_redirector', None))
69
+
70
+ # https://github.com/Textualize/textual/blob/676045381b7178c3bc94b86901f20764e08aca49/src/textual/app.py#L730-L741
71
+ setattr(self, 'devtools', devtools)
72
+ setattr(self, '_devtools_redirector', tx_dev_redirect_output.StdoutRedirector(devtools))
73
+
74
+ self._skip_devtools_management = True
75
+
76
+ async def _init_devtools(self) -> None:
77
+ if self._skip_devtools_management:
78
+ return
79
+
80
+ await super()._init_devtools() # type: ignore # noqa
81
+
82
+ async def _disconnect_devtools(self) -> None:
83
+ if self._skip_devtools_management:
84
+ return
85
+
86
+ await super()._disconnect_devtools() # type: ignore # noqa
87
+
88
+
89
+ ##
90
+
91
+
92
+ class DevtoolsSetup(lang.Func1[DevtoolsAppMixin, None]):
93
+ pass
94
+
95
+
96
+ class DevtoolsManager:
97
+ def __init__(
98
+ self,
99
+ config: DevtoolsConfig = DevtoolsConfig(),
100
+ ) -> None:
101
+ super().__init__()
102
+
103
+ self._config = config
104
+ self._devtools: ta.Optional['tx_dev_client.DevtoolsClient'] = None
105
+ self._setup: DevtoolsSetup | None = None
106
+
107
+ async def get_setup(self) -> DevtoolsSetup:
108
+ if self._setup is None:
109
+ check.none(self._devtools)
110
+
111
+ self._devtools = await connect_devtools(self._config)
112
+
113
+ self._setup = DevtoolsSetup(self._setup_app_dev_tools)
114
+
115
+ return self._setup
116
+
117
+ def _setup_app_dev_tools(self, app: DevtoolsAppMixin) -> None:
118
+ if (devtools := self._devtools) is None:
119
+ return
120
+
121
+ check.isinstance(app, DevtoolsAppMixin)._install_devtools(devtools) # noqa
122
+
123
+ async def aclose(self) -> None:
124
+ if (devtools := self._devtools) is not None and devtools.is_connected:
125
+ await devtools.disconnect()
126
+
127
+
128
+ ##
129
+
130
+
131
+ class DevtoolsLoggingHandler(logging.Handler):
132
+ """
133
+ TODO:
134
+ - reify caller from LogContextInfos
135
+ - queue worker, this blocks the asyncio thread lol
136
+ """
137
+
138
+ def __init__(
139
+ self,
140
+ devtools: ta.Optional['tx_dev_client.DevtoolsClient'],
141
+ prototype_handler: logging.Handler | None = None,
142
+ ) -> None:
143
+ super().__init__()
144
+
145
+ self._devtools = devtools
146
+
147
+ if prototype_handler is not None:
148
+ self.setFormatter(prototype_handler.formatter)
149
+ for lf in prototype_handler.filters:
150
+ self.addFilter(lf)
151
+
152
+ def emit(self, record: logging.LogRecord) -> None:
153
+ if (devtools := self._devtools) is None or not devtools.is_connected:
154
+ return
155
+
156
+ msg = self.format(record)
157
+
158
+ caller = inspect.Traceback(
159
+ filename=record.filename,
160
+ lineno=record.lineno,
161
+ function=record.funcName,
162
+ code_context=None,
163
+ index=None,
164
+ )
165
+
166
+ group, verbosity = translate_log_level(record.levelno)
167
+
168
+ devtools.log(
169
+ tx_dev_client.DevtoolsLog(
170
+ msg,
171
+ caller=caller,
172
+ ),
173
+ group=group,
174
+ verbosity=verbosity,
175
+ )
176
+
177
+
178
+ def set_root_logger_to_devtools(devtools: ta.Optional['tx_dev_client.DevtoolsClient']) -> None:
179
+ from omlish.logs.std.standard import _locking_logging_module_lock # noqa
180
+ from omlish.logs.std.standard import StandardConfiguredLoggingHandler
181
+
182
+ with _locking_logging_module_lock():
183
+ std_handler = next((h for h in logging.root.handlers if isinstance(h, StandardConfiguredLoggingHandler)), None)
184
+
185
+ dt_handler = DevtoolsLoggingHandler(devtools, std_handler)
186
+
187
+ logging.root.handlers = [dt_handler]
@@ -0,0 +1,20 @@
1
+ import logging
2
+
3
+ from textual import LogGroup # noqa
4
+ from textual import LogVerbosity # noqa
5
+
6
+
7
+ ##
8
+
9
+
10
+ def translate_log_level(level: int) -> tuple[LogGroup, LogVerbosity]:
11
+ if level >= logging.ERROR:
12
+ return (LogGroup.ERROR, LogVerbosity.HIGH)
13
+ elif level >= logging.WARNING:
14
+ return (LogGroup.ERROR, LogVerbosity.HIGH)
15
+ elif level >= logging.INFO:
16
+ return (LogGroup.INFO, LogVerbosity.NORMAL)
17
+ elif level >= logging.DEBUG:
18
+ return (LogGroup.DEBUG, LogVerbosity.NORMAL)
19
+ else:
20
+ return (LogGroup.UNDEFINED, LogVerbosity.NORMAL)
@@ -0,0 +1,45 @@
1
+ import typing as ta
2
+
3
+ from textual.geometry import Spacing
4
+
5
+
6
+ ##
7
+
8
+
9
+ class TopRightBottomLeft(ta.Protocol):
10
+ """
11
+ A ducktype for at least the following:
12
+ - textual.geometry.Spacing - margin, padding
13
+ - textual.css._style_properties.Edges - border
14
+ """
15
+
16
+ @property
17
+ def top(self) -> ta.Any: ...
18
+
19
+ @property
20
+ def right(self) -> ta.Any: ...
21
+
22
+ @property
23
+ def bottom(self) -> ta.Any: ...
24
+
25
+ @property
26
+ def left(self) -> ta.Any: ...
27
+
28
+
29
+ @ta.overload
30
+ def trbl_to_dict(trbl: Spacing) -> dict[str, int]:
31
+ ...
32
+
33
+
34
+ @ta.overload
35
+ def trbl_to_dict(trbl: TopRightBottomLeft) -> dict[str, ta.Any]:
36
+ ...
37
+
38
+
39
+ def trbl_to_dict(trbl):
40
+ return {
41
+ 'top': trbl.top,
42
+ 'right': trbl.right,
43
+ 'bottom': trbl.bottom,
44
+ 'left': trbl.left,
45
+ }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.0.dev486
3
+ Version: 0.0.0.dev500
4
4
  Summary: omdev
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -14,9 +14,9 @@ Classifier: Programming Language :: Python :: 3.13
14
14
  Requires-Python: >=3.13
15
15
  Description-Content-Type: text/markdown
16
16
  License-File: LICENSE
17
- Requires-Dist: omlish==0.0.0.dev486
17
+ Requires-Dist: omlish==0.0.0.dev500
18
18
  Provides-Extra: all
19
- Requires-Dist: black~=25.11; extra == "all"
19
+ Requires-Dist: black~=25.12; extra == "all"
20
20
  Requires-Dist: pycparser~=2.23; extra == "all"
21
21
  Requires-Dist: pcpp~=1.30; extra == "all"
22
22
  Requires-Dist: docutils~=0.22; extra == "all"
@@ -27,9 +27,11 @@ Requires-Dist: mypy~=1.19; extra == "all"
27
27
  Requires-Dist: gprof2dot~=2025.4; extra == "all"
28
28
  Requires-Dist: segno~=1.6; extra == "all"
29
29
  Requires-Dist: rich~=14.2; extra == "all"
30
- Requires-Dist: textual~=6.8; extra == "all"
30
+ Requires-Dist: textual~=7.0; extra == "all"
31
+ Requires-Dist: textual-dev~=1.8; extra == "all"
32
+ Requires-Dist: textual-speedups~=0.2; extra == "all"
31
33
  Provides-Extra: black
32
- Requires-Dist: black~=25.11; extra == "black"
34
+ Requires-Dist: black~=25.12; extra == "black"
33
35
  Provides-Extra: c
34
36
  Requires-Dist: pycparser~=2.23; extra == "c"
35
37
  Requires-Dist: pcpp~=1.30; extra == "c"
@@ -46,7 +48,9 @@ Provides-Extra: qr
46
48
  Requires-Dist: segno~=1.6; extra == "qr"
47
49
  Provides-Extra: tui
48
50
  Requires-Dist: rich~=14.2; extra == "tui"
49
- Requires-Dist: textual~=6.8; extra == "tui"
51
+ Requires-Dist: textual~=7.0; extra == "tui"
52
+ Requires-Dist: textual-dev~=1.8; extra == "tui"
53
+ Requires-Dist: textual-speedups~=0.2; extra == "tui"
50
54
  Dynamic: license-file
51
55
 
52
56
  # Overview
@@ -1,5 +1,6 @@
1
- omdev/.omlish-manifests.json,sha256=cMWrMB14_AFp9mQiTEeoTYL1uaC3zq7ER7-XHGCXY8I,11671
2
- omdev/__about__.py,sha256=RV7Fy-hXgH-DzrT_CblLerkbVlKmGWiljInLa5ssZqg,1237
1
+ omdev/.omlish-manifests.json,sha256=v-w4De6oXGrwxviG20OgLm2GOoUNQFvxGFq2OqTCMf8,11671
2
+ omdev/README.md,sha256=IxhRiW6wAsK4XKR9lmOlpkTbX8vcNcQwqal8HelK0yU,3326
3
+ omdev/__about__.py,sha256=nMssA9q43dzIMvRbHaq2jSy1S6XNbApJ0SE9SBAXNbA,1322
3
4
  omdev/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
5
  omdev/cmake.py,sha256=gu49t10_syXh_TUJs4POsxeFs8we8Y3XTOOPgIXmGvg,4608
5
6
  omdev/imgur.py,sha256=oqei705LhSnLWQTOMHMHwRecRXcpSEP90Sg4SVINPQ0,3133
@@ -77,7 +78,7 @@ omdev/ci/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
77
78
  omdev/ci/__main__.py,sha256=Jsrv3P7LX2Cg08W7ByZfZ1JQT4lgLDPW1qNAmShFuMk,75
78
79
  omdev/ci/cache.py,sha256=aKsNvl7fTJfjpFhUrWgKCNEwgoSfTZpEcn0NUY9BOCM,8456
79
80
  omdev/ci/ci.py,sha256=ZCBQuX5fiyzgBLFndxh1To2J-KrjoPlw4EvEruDIdjg,7923
80
- omdev/ci/cli.py,sha256=RpNPCkeWtkXE9D73mz-VSTfcIxQoGPGpWkZ6_mgUz-A,7253
81
+ omdev/ci/cli.py,sha256=bqOyaPcCKIlqyUE7DMA2Yzf4SpHBqQxY2ISybrMQO-M,7257
81
82
  omdev/ci/compose.py,sha256=SXjWuHuLN9NQttvnJ440A88VI7JPU0sSaQhfWe_-IKs,4518
82
83
  omdev/ci/consts.py,sha256=HkSYz-_hHilcHPBvRs-SwcUxW7vMNlHXZ8OyIKnVQbQ,21
83
84
  omdev/ci/inject.py,sha256=Yk7bT7sRC76PUN9qQ07MiveAuQmi1LZBKxah7VKOB5Q,1930
@@ -115,7 +116,7 @@ omdev/ci/github/api/v2/client.py,sha256=XuEAR46tNFZpGRPIPFgdpwTA10mC89wwj-X035Qi
115
116
  omdev/cli/__init__.py,sha256=V_l6VP1SZMlJbO-8CJwSuO9TThOy2S_oaPepNYgIrbE,37
116
117
  omdev/cli/__main__.py,sha256=mOJpgc07o0r5luQ1DlX4tk2PqZkgmbwPbdzJ3KmtjgQ,138
117
118
  omdev/cli/_pathhack.py,sha256=ABWxtuMY29WBOPqC-4LAZK9S9PwGY3zn5aK6HavFPh0,2125
118
- omdev/cli/clicli.py,sha256=TZnQYHyyh97B6N_pVYYduYgt03s8Yp5mrJ7wblXWSWY,6308
119
+ omdev/cli/clicli.py,sha256=eD0YNvprg1_Kgeu_r8DiGb3yVOOeYGymXE2d5h-0z4I,7422
119
120
  omdev/cli/install.py,sha256=oB34AOwu07sqEztW_z5mgorAFoP_Tw556XiTPj2WSM0,4904
120
121
  omdev/cli/main.py,sha256=JIyQjaoVkXpkanNYpJbQnauzvpMtzn9-nXGKu57dVls,6947
121
122
  omdev/cli/managers.py,sha256=BV98_n30Jj63OJrFgRoVZRfICxMLXEZKoEn4rMj9LV4,1160
@@ -133,7 +134,7 @@ omdev/dataclasses/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU
133
134
  omdev/dataclasses/__main__.py,sha256=N-a0Lf_s7D0VajuZCCY_dt8R4rSpeck9inbCsoIvciQ,175
134
135
  omdev/dataclasses/_dumping.py,sha256=36xWx43BGYHADYoPOhNIAbhlBPHWiHulBdCyicXHWMQ,54823
135
136
  omdev/dataclasses/_template.py,sha256=DI0L4YL-YnrIgaEA9e4bvpV4lHQWDDcvr3-tjQ-kHBc,250
136
- omdev/dataclasses/cli.py,sha256=ulI5TsBWsHVu41tCqtBVXOLfDwwmxSygkPp0qHbVhec,545
137
+ omdev/dataclasses/cli.py,sha256=IyZkEcrk5Pv553q70a8-EA4YOPnCL0BlIUrY-xSiszM,549
137
138
  omdev/dataclasses/codegen.py,sha256=SOCe8EzwPKLh7CcXFJ7xihJuDFDADoYZyQNzCgNQ4eI,10578
138
139
  omdev/dataclasses/dumping.py,sha256=5v9U1F0LLizNWxi7STivrYP4cHYCx-q_ZWhNSqzRTB0,5570
139
140
  omdev/dataserver/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
@@ -157,12 +158,12 @@ omdev/intellij/ides.py,sha256=5YSJZ0Sbe6UPExn6atOlZd7j3WK1hptHh4RDxSh6CkI,1639
157
158
  omdev/intellij/open.py,sha256=3HlbJsGkwZ28UBi1P7dVJMRDMLbJyOGQs9QMQqgYVus,2679
158
159
  omdev/interp/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
159
160
  omdev/interp/__main__.py,sha256=GMCqeGYltgt5dlJzHxY9gqisa8cRkrPfmZYuZnjg4WI,162
160
- omdev/interp/cli.py,sha256=xYZHts_tYuWPenTTLQIQ-I1JWHao6XolsH0R73AufDY,2380
161
+ omdev/interp/cli.py,sha256=x7CYOY6SBf57dnSrAXwgL50KNjKtqCEN_xeM6KiTY9A,2384
161
162
  omdev/interp/default.py,sha256=1jxTsCeCkmYX1QDgr-bPcfSTFdbkYCNKrdfdVf4_P8M,290
162
163
  omdev/interp/inject.py,sha256=MOppFILGFCp2f4-2uwmH5fN-7erHI3RyMQJaG0kw0Gc,1569
163
164
  omdev/interp/inspect.py,sha256=GLjqRkmNr3H0CZsiFqizM_2yfUL7hSD-BGYysNcVi_Q,3018
164
165
  omdev/interp/resolvers.py,sha256=9ExwP0wcQ4mzyTLNurSG4Dg1AQ_IqLfR2ZyqR4VRANE,2590
165
- omdev/interp/types.py,sha256=Pr0wrVpNasoCw-ThEvKC5LG30Civ7YJ4EONwrwBLpy0,2516
166
+ omdev/interp/types.py,sha256=B5m522tu5xi4sWjxlmZgeHtcnPW5xuMPKvMbcarmfwY,2548
166
167
  omdev/interp/venvs.py,sha256=KAnkHGP8jV8KmiarRl2wuMbya-CEgyN6hEM68irGOxs,3362
167
168
  omdev/interp/providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
168
169
  omdev/interp/providers/base.py,sha256=zMtzMJIDvaI0q1gtsZTCvFiTc7qdhGbUcXRs6LCBmgo,1333
@@ -177,7 +178,7 @@ omdev/interp/pyenv/provider.py,sha256=YvlTqG3GET8uW03d21ba0vNOzF6aPC4IbpbiGbErGO
177
178
  omdev/interp/pyenv/pyenv.py,sha256=Kf1K80v0zcw1BmBQPLczH4dz770_js_ma4Sj4_XOEcU,2654
178
179
  omdev/interp/uv/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
179
180
  omdev/interp/uv/inject.py,sha256=nNCfjD-nrErM8wM__Z51rxqZjV3Cn0kE25jFAbkrPag,595
180
- omdev/interp/uv/provider.py,sha256=C5ztIY6tfQU720ddg_Br8JJ0QNMvQPoZ3_mBpCKdsFI,1070
181
+ omdev/interp/uv/provider.py,sha256=dnQAH2cDwVqRKDejftcZnfFZvQeNxwnOH4KC1J9l9f4,1867
181
182
  omdev/interp/uv/uv.py,sha256=NaVQOzgbcrx6LkpXPmcmR9iVknFHgnslMlbBHf8VTTc,1810
182
183
  omdev/irc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
183
184
  omdev/irc/messages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -211,7 +212,7 @@ omdev/manifests/__main__.py,sha256=JqyVDyV7_jo-NZ3wSs5clDU_xCMlxzJv-XFohoZWQ7E,1
211
212
  omdev/manifests/_dumping.py,sha256=DRaiapOrM7pmSShcnGcMjxGBdXClntSokHCLBjKflS0,56124
212
213
  omdev/manifests/building.py,sha256=M3IHQljk0ca0J32-xNTOcFVvW07s_7fHQ7sGsCJeurU,13908
213
214
  omdev/manifests/dumping.py,sha256=WUIZDvOyO25AhnCPn5Nxj2OkMcZa1LRjGuCnpyx8AL8,4506
214
- omdev/manifests/main.py,sha256=mYb8iM5bdwaO8jSd9_hIBSoYLf2h7e0iLb9aCCbgJ6c,2175
215
+ omdev/manifests/main.py,sha256=Gch-ZmvzXyfQRZp_h56RL_hn1T_qG5ZhGCJYp57Hzro,2179
215
216
  omdev/markdown/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
216
217
  omdev/markdown/incparse.py,sha256=zldzPESdrgaoIjBLL9ZPZY11riXCY_3Ti4YDeLtz24Y,3824
217
218
  omdev/markdown/tokens.py,sha256=YwFUhxaun4_BiKYXrrX3CBka4ruqdh8Ogl7G8hGvlLA,1483
@@ -236,7 +237,7 @@ omdev/packaging/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
236
237
  omdev/packaging/marshal.py,sha256=OPNqH6Ghjw5EQQsp0z2QAwThjIOE6vJ5VAoQca4aqHI,2376
237
238
  omdev/packaging/names.py,sha256=-orp16m20gSFeKRiGkRNyqFVV4S1y_Djvjdq_5hNwpY,2533
238
239
  omdev/packaging/requires.py,sha256=nn4ff8mlgfsdZooKzQjhASFS7mMVUCCmcb-150F0Lcg,15739
239
- omdev/packaging/revisions.py,sha256=tLNDVtPiygB8mSxwp-kDxeEHhpBzD0jayndjsgUOfkM,5055
240
+ omdev/packaging/revisions.py,sha256=9fqAANSRhTkfONjfsulu8veJP5gYr23c3MSh4JDvXcE,5059
240
241
  omdev/packaging/specifiers.py,sha256=7SzsdHVtI-ilLMlvDXNgMLSoqx5JW_ePDrbtTOrx5tw,17472
241
242
  omdev/packaging/versions.py,sha256=Bgzh6B_t-IRh-9H1CGJdoQ-j7DlpwJzT1WS813W6XdU,12307
242
243
  omdev/packaging/wheelfile.py,sha256=lFykff73tqqJl_0HwYZCTlAOUnRMTg_ZWiOSTsG5V5U,10018
@@ -283,30 +284,30 @@ omdev/py/tokens/utils.py,sha256=_dlXx-_npiGeZkMZVbXaXQDGts9yY8UnEJcT_bwPj0A,2084
283
284
  omdev/py/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
284
285
  omdev/py/tools/importscan.py,sha256=OYPZBg__u6On416tcmYfRTMkjr1ZlFcOAy9AafJ8iuo,4648
285
286
  omdev/py/tools/mkrelimp.py,sha256=kQAADYW1f1Y2WbIuqWOFNWJl96oT7nqW38XPCkLIyjQ,4039
286
- omdev/py/tools/pipdepup.py,sha256=ZmOaUXLu1qHmkxJKsGKAYGkdtwiZMqZHJQhCGTK0x18,18225
287
+ omdev/py/tools/pipdepup.py,sha256=3s3rTlj0KcVriEw_x3wLuoqQnRjdPCydDWW7fhliUl4,20082
287
288
  omdev/pyproject/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
288
289
  omdev/pyproject/__main__.py,sha256=gn3Rl1aYPYdiTtEqa9ifi0t-e4ZwPY0vhJ4UXvYdJDY,165
289
- omdev/pyproject/cli.py,sha256=Umsu2bcJUYeeVXICaZFhKckUBT6VWuYDL4htgCGGQIs,8749
290
+ omdev/pyproject/cli.py,sha256=qrFlVI_s_viIWE_vmccNNVuQaQP9-cArLJDP2ClqwTM,8753
290
291
  omdev/pyproject/configs.py,sha256=baNRwHtUW8S8DKCxuKlMbV3Gduujd1PyNURxQ48Nnxk,2813
291
292
  omdev/pyproject/inject.py,sha256=Von8_8ofkITLoCEwDHNRAwY0AEdFQg7r2ILS8kcTMuY,325
292
- omdev/pyproject/pkg.py,sha256=HE7MhF93qIBqfdsvJCzIOMWlbAPt0s7qU04FGEwasFs,19449
293
- omdev/pyproject/reqs.py,sha256=DU7NBNpFTjU06VgqRYZj5jZRQxpIWbzL9q9Vm13_o0o,3317
293
+ omdev/pyproject/pkg.py,sha256=BrC8DQFIQ1ZKFGoNAJ2wdK8PB8N_fpCVaKFKDh82w4s,19460
294
+ omdev/pyproject/reqs.py,sha256=ZMx-UFQXiSkV0gVpO81zJPa-djvvBrvmY-1kFzxioNk,3369
294
295
  omdev/pyproject/venvs.py,sha256=PNgfVrGlw9NFKJgUyzyWH5H5nAIzUDPTHRVUNBM0bKs,2187
295
296
  omdev/pyproject/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
296
297
  omdev/pyproject/resources/docker-dev.sh,sha256=DHkz5D18jok_oDolfg2mqrvGRWFoCe9GQo04dR1czcc,838
297
298
  omdev/pyproject/resources/python.sh,sha256=rFaN4SiJ9hdLDXXsDTwugI6zsw6EPkgYMmtacZeTbvw,749
298
299
  omdev/pyproject/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
299
- omdev/pyproject/tools/aboutdeps.py,sha256=wd-glPAjmwqWv_ndKHtXTiELRqZJB0jLn16F2GSeB1k,1533
300
+ omdev/pyproject/tools/aboutdeps.py,sha256=XmvSKsn3kdY0K2Llh-jhNskm4sK46Y8fWnUlPXBrI34,1592
300
301
  omdev/rs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
301
302
  omdev/scripts/__init__.py,sha256=MKCvUAEQwsIvwLixwtPlpBqmkMXLCnjjXyAXvVpDwVk,91
302
- omdev/scripts/ci.py,sha256=i-iiyuj8HBDvJS4lcekaQiwvGsaV3LCpbI9Qhv0gq8s,440329
303
- omdev/scripts/interp.py,sha256=F_ARmInLrMNpMRY_rOSC40EukaZdctstVNKAIR9s8UE,174039
304
- omdev/scripts/pyproject.py,sha256=oCjDx9uTN1T28e7t9idi2dNZY5LMLv14cdBVCPtysK4,362395
303
+ omdev/scripts/ci.py,sha256=YhYd0S2osBCOvgdZu_BHD8-qS6PBmFnlBgjK81jQaMg,448272
304
+ omdev/scripts/interp.py,sha256=CvrxfmIuZ6xsL8PcebgKaqCiVm-WT5Z5I8ByhWIstt4,174830
305
+ omdev/scripts/pyproject.py,sha256=oSSX0LXPKN5av_uq9e1Vb9WccqkA0hlWscKtoBRbGRY,371173
305
306
  omdev/scripts/slowcat.py,sha256=PwdT-pg62imEEb6kcOozl9_YUi-4KopvjvzWT1OmGb0,2717
306
307
  omdev/scripts/tmpexec.py,sha256=t0nErDRALjTk7H0X8ADjZUIDFjlPNzOOokmjCjBHdzs,1431
307
308
  omdev/scripts/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
308
309
  omdev/scripts/lib/inject.py,sha256=oygdsbyucoy6f4giWw-H-bYSmHvhywX2gaTrOuf5L_I,55188
309
- omdev/scripts/lib/logs.py,sha256=VzV78-qOAIBKx1xy6axcE7zVGXeHjdCG6TuhAC7HzXA,65238
310
+ omdev/scripts/lib/logs.py,sha256=NHUFy2I4--mm1S2XefH0V9w4HDKCqxHtE1gCVT5WP2w,67003
310
311
  omdev/scripts/lib/marshal.py,sha256=m6lZYAebgyiXz-yO9NQ1doo2Ths2dvQJH4Gu79hA7dg,48289
311
312
  omdev/tools/__init__.py,sha256=iVJAOQ0viGTQOm0DLX4uZLro-9jOioYJGLg9s0kDx1A,78
312
313
  omdev/tools/cloc.py,sha256=BiIf2PnnoRH6ByH4mnua69Vv-ZDPHsSAPUds7giRolI,6013
@@ -324,54 +325,62 @@ omdev/tools/shell.py,sha256=5hF_8DCtB3XrzJSfmQDsr7X3Fi9KRV4M70q9qp0KREA,2341
324
325
  omdev/tools/sqlrepl.py,sha256=TcLJlElzfXqYUkfIOwhJHtXiQjXOg4xBTwSoSRDpNkg,5758
325
326
  omdev/tools/git/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
326
327
  omdev/tools/git/__main__.py,sha256=gI87SBUgTkKUcUM-RtZWnei-UUDDqzbr5aPztb-gvbE,168
327
- omdev/tools/git/cli.py,sha256=AeAqr6ugkvUXt1vp9ywfG2GMg61AQjB2VowCG4ondX0,17119
328
+ omdev/tools/git/cli.py,sha256=P2uzPavBmbklgc_it7XB1d9TrmSo29g-A1MzUePkoOo,17697
328
329
  omdev/tools/git/cloning.py,sha256=CNGBBMoWaTBJW4SZTf1VvhDFSm0yg7qDfNwZun_PFbU,891
329
330
  omdev/tools/git/consts.py,sha256=JuXivUNDkNhM4pe97icjRVAKM8cNRbrODquHINNKqOE,40
330
331
  omdev/tools/git/messages.py,sha256=R39pXfXt8394eC99rpTdRlbcMrAdLxwsgTR4pwRRa-o,2321
331
332
  omdev/tools/json/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
332
333
  omdev/tools/json/__main__.py,sha256=wqpkN_NsQyNwKW4qjVj8ADJ4_C98KhrFBtE-Z1UamfU,168
333
334
  omdev/tools/json/cli.py,sha256=d7i5aPsFGIfHirY1U845t7gARpy3mu1YtvYa-qBkQF4,10142
334
- omdev/tools/json/formats.py,sha256=1qGYb8Kq_yFpLMaecBg-XE3yWSvqRiRbBX8SAElpS9s,2643
335
+ omdev/tools/json/formats.py,sha256=dhIvWkB7HjvxSBUgk3psTiXLzQ8tksrOK5jKNUbUgx8,2677
335
336
  omdev/tools/json/io.py,sha256=sfj2hJS9Hy3aUR8a_lLzOrYcmL9fSKyvOHiofdUASsI,1427
336
337
  omdev/tools/json/parsing.py,sha256=R7h-UkwFm3Q0L8oHTk-aLtQN6x32-vkDXwLUxExL0tI,2000
337
338
  omdev/tools/json/processing.py,sha256=sSfL6iMB7Znp5ntAFeXYCog0GLA49dPfvoXRoG0D_AY,2525
338
339
  omdev/tools/json/rendering.py,sha256=dsZki-47lPuYP_-x7gFFl57IZnCJUXHS-NBGpQZjvk0,2628
339
340
  omdev/tools/jsonview/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
340
341
  omdev/tools/jsonview/__main__.py,sha256=BF-MVWpPJJeQYUqJA48G395kxw0lEJnV-hRLV_F9G2A,173
341
- omdev/tools/jsonview/cli.py,sha256=iSuL9Q6oa-56-slpsbhUo8gba_tWWo06_sOgQJmg3BE,4906
342
+ omdev/tools/jsonview/cli.py,sha256=KhnR_DavUUkCll5xXdpwG_ChUu7VQBm6OCvzOJfeLnk,4040
342
343
  omdev/tools/jsonview/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
343
344
  omdev/tools/jsonview/resources/jsonview.css,sha256=RqQMm98EnQkbVM-8BgjNduzUfsVDMzgNC_NjjwG0bqI,579
345
+ omdev/tools/jsonview/resources/jsonview.html.j2,sha256=SmrVKW6OQONmQ8Y7i_kYs1BCGxEW3Zl4BpGLI64NQxM,1016
344
346
  omdev/tools/jsonview/resources/jsonview.js,sha256=faDvXDOXKvEvjOuIlz4D3F2ReQXb_buXDU27hKuuqAw,1648
347
+ omdev/tools/pawk/README.md,sha256=wso8RBdIKv7mbu40hFA-mdzMjT2Dj8gMMknVk98Pemg,6065
345
348
  omdev/tools/pawk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
346
349
  omdev/tools/pawk/__main__.py,sha256=VCqeRVnqT1RPEoIrqHFSu4PXVMg4YEgF4qCQm90-eRI,66
347
350
  omdev/tools/pawk/pawk.py,sha256=HZIkXOXCH5NdIFsMF2upf5n-TePuRABoZg4_l1A9jrM,11465
348
351
  omdev/tui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
349
352
  omdev/tui/apps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
350
353
  omdev/tui/apps/edit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
351
- omdev/tui/apps/edit/main.py,sha256=9ZLtvZTC0QAYUt-b_kBNvHQkUEDR_ofTw4pf-vdrKg8,4460
354
+ omdev/tui/apps/edit/main.py,sha256=38JwC_lOdSC4ZpwHBa2CZrT7XH9YFJsXyhF8cTNxn8U,4464
352
355
  omdev/tui/apps/irc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
353
356
  omdev/tui/apps/irc/__main__.py,sha256=d23loR_cKfTYZwYiqpt_CmKI7dd5WcYFgIYzqMep75E,68
354
- omdev/tui/apps/irc/app.py,sha256=GVmNeh4f0NZDbSzv0iUIjl8oYFBn9niI1RnG2TXRwY4,9158
357
+ omdev/tui/apps/irc/app.py,sha256=y7i9-fcFRG4zDZJVRecadoNEHXtEQ9FUV6mXFuj4CLs,9238
355
358
  omdev/tui/apps/irc/client.py,sha256=H4oO-TO_2XTMWMMezqCurj46n6ARO25gCEaCCCkQgc8,5869
356
- omdev/tui/apps/irc/commands.py,sha256=nBzE2A8Q727RYwvv9ULeoCwi0vogK9KPzT36hvsfg48,5642
359
+ omdev/tui/apps/irc/commands.py,sha256=vWxsquwE4GP-LgPxzWq4a10Zj2DTEFf6kHc_uwFqiDk,5648
357
360
  omdev/tui/apps/irc/main.py,sha256=ptsSjKE3LDmPERCExivcjTN7SOfYY7WVnIlDXSL_XQA,510
358
361
  omdev/tui/apps/markdown/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
359
362
  omdev/tui/apps/markdown/__main__.py,sha256=Xy-G2-8Ymx8QMBbRzA4LoiAMZqvtC944mMjFEWd69CA,182
360
363
  omdev/tui/apps/markdown/cli.py,sha256=K1vH7f3ZqLv4xTPluhJBEZH8nx8n42_vXIALEV07Q50,469
361
- omdev/tui/rich/__init__.py,sha256=ZmStqeMrES5FiHLCysKRcg3vvmrIfksIZknDIGD1o0E,809
364
+ omdev/tui/rich/__init__.py,sha256=2WPxYFGWqwxxLdFBqWpU2nS2DmT7LLFUWXHOrqbqjnQ,1331
362
365
  omdev/tui/rich/console2.py,sha256=BYYLbbD65If9TvfPI6qUcMQKUWJbuWwykEzPplvkf6A,342
363
366
  omdev/tui/rich/markdown2.py,sha256=fBcjG_34XzUf4WclBL_MxvBj5NUwvLCANhHCx3R0akw,6139
364
- omdev/tui/textual/__init__.py,sha256=VyXaziSRncfbqmfix0cuLU_ENDAO_dTziXRvNksl-C8,10601
365
- omdev/tui/textual/app2.py,sha256=QNh8dX9lXtvWkUOLX5x6ucJCYqDoKD78VDpaX4ZcGS8,225
367
+ omdev/tui/textual/__init__.py,sha256=U1TSKwGgLU_P--9q9iNylFxkNbOef6ZAcGlU9elPmfo,11722
368
+ omdev/tui/textual/app2.py,sha256=j_Naee14VqvJo3ujxiafva6ILkhHBYYYet066vM5WdY,294
369
+ omdev/tui/textual/devtools.py,sha256=iGs4zQo-o2ncspRk4IYyuvYKGC2ZVkYyPy8ugy7wvf4,5137
366
370
  omdev/tui/textual/drivers2.py,sha256=ZVxI9n6cyczjrdjqKOAjE51pF0yppACJOVmqLaWuJuM,1402
371
+ omdev/tui/textual/logging2.py,sha256=At6TUBfR0ixFXmS6G2tEqtjcR3AmCwoiid70NDleg-8,576
372
+ omdev/tui/textual/types.py,sha256=jOUGL10Ie29uCZODlloulPINL0VwN8kj5vjWRkgzHEI,782
367
373
  omdev/tui/textual/autocomplete/LICENSE,sha256=E4XIgwSRB-UmqQi5b3HvRUfmpR9vfi99rvxGjnkS6BI,1069
368
374
  omdev/tui/textual/autocomplete/__init__.py,sha256=m0EGewct7SoATrTcsCSmeRQyPucP5Sqew5qZOIQUgKI,1442
369
375
  omdev/tui/textual/autocomplete/matching.py,sha256=joxUxF4jfs47E4JK0DAo_l0lwoNe9mU6iJzxI2FlVYI,6801
370
376
  omdev/tui/textual/autocomplete/paths.py,sha256=Z3ZlTkPZezKBaFgB23d6IFJXanJc8OueBm-S0kExdRM,7242
371
377
  omdev/tui/textual/autocomplete/widget.py,sha256=1UgWqDT0d9wD6w7MNaZBjgj0o9FohYXydifocPErdks,22629
372
- omdev-0.0.0.dev486.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
373
- omdev-0.0.0.dev486.dist-info/METADATA,sha256=pEzAP4ls2t88e0k7pQtuozMG76mUqYMMRbr1WLZUxL0,5172
374
- omdev-0.0.0.dev486.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
375
- omdev-0.0.0.dev486.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
376
- omdev-0.0.0.dev486.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
377
- omdev-0.0.0.dev486.dist-info/RECORD,,
378
+ omdev/tui/textual/debug/__init__.py,sha256=RW9-Toj5_JnXBJCnRiXpXLpRA__MxG01xW1h_iNuUTY,189
379
+ omdev/tui/textual/debug/dominfo.py,sha256=1iH1xbZY-zUoIyfmdvSzVNjGqeeOnBcjeDI2V1Xn3rg,4401
380
+ omdev/tui/textual/debug/screen.py,sha256=w4cbRJWemcu5jBomGDmVtgtjiaWOS1Wkw1Mc6mu-5Zc,594
381
+ omdev-0.0.0.dev500.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
382
+ omdev-0.0.0.dev500.dist-info/METADATA,sha256=fiCGLsJUucH2fOHkoQysgb-UVJe6znlno9c5XmKK2NQ,5374
383
+ omdev-0.0.0.dev500.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
384
+ omdev-0.0.0.dev500.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
385
+ omdev-0.0.0.dev500.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
386
+ omdev-0.0.0.dev500.dist-info/RECORD,,