omdev 0.0.0.dev439__py3-none-any.whl → 0.0.0.dev486__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.
- omdev/.omlish-manifests.json +18 -30
- omdev/__about__.py +9 -7
- omdev/amalg/gen/gen.py +49 -6
- omdev/amalg/gen/imports.py +1 -1
- omdev/amalg/gen/manifests.py +1 -1
- omdev/amalg/gen/resources.py +1 -1
- omdev/amalg/gen/srcfiles.py +13 -3
- omdev/amalg/gen/strip.py +1 -1
- omdev/amalg/gen/types.py +1 -1
- omdev/amalg/gen/typing.py +1 -1
- omdev/amalg/info.py +32 -0
- omdev/cache/data/actions.py +1 -1
- omdev/cache/data/specs.py +1 -1
- omdev/cexts/_boilerplate.cc +2 -3
- omdev/cexts/cmake.py +4 -1
- omdev/ci/cli.py +1 -2
- omdev/ci/github/api/v2/api.py +2 -0
- omdev/cmdlog/cli.py +1 -2
- omdev/dataclasses/_dumping.py +1960 -0
- omdev/dataclasses/_template.py +22 -0
- omdev/dataclasses/cli.py +6 -1
- omdev/dataclasses/codegen.py +340 -60
- omdev/dataclasses/dumping.py +200 -0
- omdev/interp/uv/provider.py +1 -0
- omdev/interp/venvs.py +1 -0
- omdev/irc/messages/base.py +50 -0
- omdev/irc/messages/formats.py +92 -0
- omdev/irc/messages/messages.py +775 -0
- omdev/irc/messages/parsing.py +99 -0
- omdev/irc/numerics/__init__.py +0 -0
- omdev/irc/numerics/formats.py +97 -0
- omdev/irc/numerics/numerics.py +865 -0
- omdev/irc/numerics/types.py +59 -0
- omdev/irc/protocol/LICENSE +11 -0
- omdev/irc/protocol/__init__.py +61 -0
- omdev/irc/protocol/consts.py +6 -0
- omdev/irc/protocol/errors.py +30 -0
- omdev/irc/protocol/message.py +21 -0
- omdev/irc/protocol/nuh.py +55 -0
- omdev/irc/protocol/parsing.py +158 -0
- omdev/irc/protocol/rendering.py +153 -0
- omdev/irc/protocol/tags.py +102 -0
- omdev/irc/protocol/utils.py +30 -0
- omdev/manifests/_dumping.py +125 -25
- omdev/markdown/__init__.py +0 -0
- omdev/markdown/incparse.py +116 -0
- omdev/markdown/tokens.py +51 -0
- omdev/packaging/marshal.py +8 -8
- omdev/packaging/requires.py +6 -6
- omdev/packaging/specifiers.py +2 -1
- omdev/packaging/versions.py +4 -4
- omdev/packaging/wheelfile.py +2 -0
- omdev/precheck/blanklines.py +66 -0
- omdev/precheck/caches.py +1 -1
- omdev/precheck/imports.py +14 -1
- omdev/precheck/main.py +4 -3
- omdev/precheck/unicode.py +39 -15
- omdev/py/asts/__init__.py +0 -0
- omdev/py/asts/parents.py +28 -0
- omdev/py/asts/toplevel.py +123 -0
- omdev/py/asts/visitors.py +18 -0
- omdev/py/attrdocs.py +6 -7
- omdev/py/bracepy.py +12 -4
- omdev/py/reprs.py +32 -0
- omdev/py/srcheaders.py +1 -1
- omdev/py/tokens/__init__.py +0 -0
- omdev/py/tools/mkrelimp.py +1 -1
- omdev/py/tools/pipdepup.py +629 -0
- omdev/pyproject/pkg.py +190 -45
- omdev/pyproject/reqs.py +31 -9
- omdev/pyproject/tools/__init__.py +0 -0
- omdev/pyproject/tools/aboutdeps.py +55 -0
- omdev/pyproject/venvs.py +8 -1
- omdev/rs/__init__.py +0 -0
- omdev/scripts/ci.py +400 -80
- omdev/scripts/interp.py +193 -35
- omdev/scripts/lib/__init__.py +0 -0
- omdev/scripts/{inject.py → lib/inject.py} +75 -28
- omdev/scripts/lib/logs.py +2079 -0
- omdev/scripts/{marshal.py → lib/marshal.py} +68 -26
- omdev/scripts/pyproject.py +941 -90
- omdev/tools/git/cli.py +12 -1
- omdev/tools/json/processing.py +5 -2
- omdev/tools/jsonview/cli.py +31 -5
- omdev/tools/pawk/pawk.py +2 -2
- omdev/tools/pip.py +8 -0
- omdev/tui/__init__.py +0 -0
- omdev/tui/apps/__init__.py +0 -0
- omdev/tui/apps/edit/__init__.py +0 -0
- omdev/tui/apps/edit/main.py +163 -0
- omdev/tui/apps/irc/__init__.py +0 -0
- omdev/tui/apps/irc/__main__.py +4 -0
- omdev/tui/apps/irc/app.py +278 -0
- omdev/tui/apps/irc/client.py +187 -0
- omdev/tui/apps/irc/commands.py +175 -0
- omdev/tui/apps/irc/main.py +26 -0
- omdev/tui/apps/markdown/__init__.py +0 -0
- omdev/tui/apps/markdown/__main__.py +11 -0
- omdev/{ptk → tui/apps}/markdown/cli.py +5 -7
- omdev/tui/rich/__init__.py +34 -0
- omdev/tui/rich/console2.py +20 -0
- omdev/tui/rich/markdown2.py +186 -0
- omdev/tui/textual/__init__.py +226 -0
- omdev/tui/textual/app2.py +11 -0
- omdev/tui/textual/autocomplete/LICENSE +21 -0
- omdev/tui/textual/autocomplete/__init__.py +33 -0
- omdev/tui/textual/autocomplete/matching.py +226 -0
- omdev/tui/textual/autocomplete/paths.py +202 -0
- omdev/tui/textual/autocomplete/widget.py +612 -0
- omdev/tui/textual/drivers2.py +55 -0
- {omdev-0.0.0.dev439.dist-info → omdev-0.0.0.dev486.dist-info}/METADATA +11 -9
- {omdev-0.0.0.dev439.dist-info → omdev-0.0.0.dev486.dist-info}/RECORD +121 -73
- omdev/ptk/__init__.py +0 -103
- omdev/ptk/apps/ncdu.py +0 -167
- omdev/ptk/confirm.py +0 -60
- omdev/ptk/markdown/LICENSE +0 -22
- omdev/ptk/markdown/__init__.py +0 -10
- omdev/ptk/markdown/__main__.py +0 -11
- omdev/ptk/markdown/border.py +0 -94
- omdev/ptk/markdown/markdown.py +0 -390
- omdev/ptk/markdown/parser.py +0 -42
- omdev/ptk/markdown/styles.py +0 -29
- omdev/ptk/markdown/tags.py +0 -299
- omdev/ptk/markdown/utils.py +0 -366
- omdev/pyproject/cexts.py +0 -110
- /omdev/{ptk/apps → irc}/__init__.py +0 -0
- /omdev/{tokens → irc/messages}/__init__.py +0 -0
- /omdev/{tokens → py/tokens}/all.py +0 -0
- /omdev/{tokens → py/tokens}/tokenizert.py +0 -0
- /omdev/{tokens → py/tokens}/utils.py +0 -0
- {omdev-0.0.0.dev439.dist-info → omdev-0.0.0.dev486.dist-info}/WHEEL +0 -0
- {omdev-0.0.0.dev439.dist-info → omdev-0.0.0.dev486.dist-info}/entry_points.txt +0 -0
- {omdev-0.0.0.dev439.dist-info → omdev-0.0.0.dev486.dist-info}/licenses/LICENSE +0 -0
- {omdev-0.0.0.dev439.dist-info → omdev-0.0.0.dev486.dist-info}/top_level.txt +0 -0
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
# @omlish-lite
|
|
4
4
|
# @omlish-script
|
|
5
5
|
# @omlish-generated
|
|
6
|
-
# @omlish-amalg-output
|
|
6
|
+
# @omlish-amalg-output ../../../omlish/lite/marshal.py
|
|
7
7
|
# @omlish-git-diff-omit
|
|
8
8
|
# ruff: noqa: UP006 UP007 UP036 UP045
|
|
9
9
|
"""
|
|
@@ -37,11 +37,26 @@ if sys.version_info < (3, 8):
|
|
|
37
37
|
raise OSError(f'Requires python (3, 8), got {sys.version_info} from {sys.executable}') # noqa
|
|
38
38
|
|
|
39
39
|
|
|
40
|
+
def __omlish_amalg__(): # noqa
|
|
41
|
+
return dict(
|
|
42
|
+
src_files=[
|
|
43
|
+
dict(path='abstract.py', sha1='a2fc3f3697fa8de5247761e9d554e70176f37aac'),
|
|
44
|
+
dict(path='check.py', sha1='bb6b6b63333699b84462951a854d99ae83195b94'),
|
|
45
|
+
dict(path='objects.py', sha1='9566bbf3530fd71fcc56321485216b592fae21e9'),
|
|
46
|
+
dict(path='reflect.py', sha1='c4fec44bf144e9d93293c996af06f6c65fc5e63d'),
|
|
47
|
+
dict(path='strings.py', sha1='89831ecbc34ad80e118a865eceb390ed399dc4d6'),
|
|
48
|
+
dict(path='marshal.py', sha1='96348f5f2a26dc27d842d33cc3927e9da163436b'),
|
|
49
|
+
],
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
|
|
40
53
|
########################################
|
|
41
54
|
|
|
42
55
|
|
|
43
|
-
#
|
|
56
|
+
# abstract.py
|
|
44
57
|
T = ta.TypeVar('T')
|
|
58
|
+
|
|
59
|
+
# check.py
|
|
45
60
|
SizedT = ta.TypeVar('SizedT', bound=ta.Sized)
|
|
46
61
|
CheckMessage = ta.Union[str, ta.Callable[..., ta.Optional[str]], None] # ta.TypeAlias
|
|
47
62
|
CheckLateConfigureFn = ta.Callable[['Checks'], None] # ta.TypeAlias
|
|
@@ -65,25 +80,49 @@ def is_abstract_method(obj: ta.Any) -> bool:
|
|
|
65
80
|
return bool(getattr(obj, _IS_ABSTRACT_METHOD_ATTR, False))
|
|
66
81
|
|
|
67
82
|
|
|
68
|
-
def
|
|
83
|
+
def compute_abstract_methods(cls: type) -> ta.FrozenSet[str]:
|
|
84
|
+
# ~> https://github.com/python/cpython/blob/f3476c6507381ca860eec0989f53647b13517423/Modules/_abc.c#L358
|
|
85
|
+
|
|
86
|
+
# Stage 1: direct abstract methods
|
|
87
|
+
|
|
88
|
+
abstracts = {
|
|
89
|
+
a
|
|
90
|
+
# Get items as a list to avoid mutation issues during iteration
|
|
91
|
+
for a, v in list(cls.__dict__.items())
|
|
92
|
+
if is_abstract_method(v)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
# Stage 2: inherited abstract methods
|
|
96
|
+
|
|
97
|
+
for base in cls.__bases__:
|
|
98
|
+
# Get __abstractmethods__ from base if it exists
|
|
99
|
+
if (base_abstracts := getattr(base, _ABSTRACT_METHODS_ATTR, None)) is None:
|
|
100
|
+
continue
|
|
101
|
+
|
|
102
|
+
# Iterate over abstract methods in base
|
|
103
|
+
for key in base_abstracts:
|
|
104
|
+
# Check if this class has an attribute with this name
|
|
105
|
+
try:
|
|
106
|
+
value = getattr(cls, key)
|
|
107
|
+
except AttributeError:
|
|
108
|
+
# Attribute not found in this class, skip
|
|
109
|
+
continue
|
|
110
|
+
|
|
111
|
+
# Check if it's still abstract
|
|
112
|
+
if is_abstract_method(value):
|
|
113
|
+
abstracts.add(key)
|
|
114
|
+
|
|
115
|
+
return frozenset(abstracts)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def update_abstracts(cls: ta.Type[T], *, force: bool = False) -> ta.Type[T]:
|
|
69
119
|
if not force and not hasattr(cls, _ABSTRACT_METHODS_ATTR):
|
|
70
120
|
# Per stdlib: We check for __abstractmethods__ here because cls might by a C implementation or a python
|
|
71
121
|
# implementation (especially during testing), and we want to handle both cases.
|
|
72
122
|
return cls
|
|
73
123
|
|
|
74
|
-
abstracts
|
|
75
|
-
|
|
76
|
-
for scls in cls.__bases__:
|
|
77
|
-
for name in getattr(scls, _ABSTRACT_METHODS_ATTR, ()):
|
|
78
|
-
value = getattr(cls, name, None)
|
|
79
|
-
if getattr(value, _IS_ABSTRACT_METHOD_ATTR, False):
|
|
80
|
-
abstracts.add(name)
|
|
81
|
-
|
|
82
|
-
for name, value in cls.__dict__.items():
|
|
83
|
-
if getattr(value, _IS_ABSTRACT_METHOD_ATTR, False):
|
|
84
|
-
abstracts.add(name)
|
|
85
|
-
|
|
86
|
-
setattr(cls, _ABSTRACT_METHODS_ATTR, frozenset(abstracts))
|
|
124
|
+
abstracts = compute_abstract_methods(cls)
|
|
125
|
+
setattr(cls, _ABSTRACT_METHODS_ATTR, abstracts)
|
|
87
126
|
return cls
|
|
88
127
|
|
|
89
128
|
|
|
@@ -137,23 +176,26 @@ class Abstract:
|
|
|
137
176
|
super().__init_subclass__(**kwargs)
|
|
138
177
|
|
|
139
178
|
if not (Abstract in cls.__bases__ or abc.ABC in cls.__bases__):
|
|
140
|
-
ams
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
179
|
+
if ams := compute_abstract_methods(cls):
|
|
180
|
+
amd = {
|
|
181
|
+
a: mcls
|
|
182
|
+
for mcls in cls.__mro__[::-1]
|
|
183
|
+
for a in ams
|
|
184
|
+
if a in mcls.__dict__
|
|
185
|
+
}
|
|
146
186
|
|
|
147
|
-
if ams:
|
|
148
187
|
raise AbstractTypeError(
|
|
149
188
|
f'Cannot subclass abstract class {cls.__name__} with abstract methods: ' +
|
|
150
189
|
', '.join(sorted([
|
|
151
190
|
'.'.join([
|
|
152
|
-
*([
|
|
153
|
-
|
|
191
|
+
*([
|
|
192
|
+
*([m] if (m := getattr(c, '__module__')) else []),
|
|
193
|
+
getattr(c, '__qualname__', getattr(c, '__name__')),
|
|
194
|
+
] if c is not None else '?'),
|
|
154
195
|
a,
|
|
155
196
|
])
|
|
156
|
-
for a
|
|
197
|
+
for a in ams
|
|
198
|
+
for c in [amd.get(a)]
|
|
157
199
|
])),
|
|
158
200
|
)
|
|
159
201
|
|