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.

Files changed (134) hide show
  1. omdev/.omlish-manifests.json +18 -30
  2. omdev/__about__.py +9 -7
  3. omdev/amalg/gen/gen.py +49 -6
  4. omdev/amalg/gen/imports.py +1 -1
  5. omdev/amalg/gen/manifests.py +1 -1
  6. omdev/amalg/gen/resources.py +1 -1
  7. omdev/amalg/gen/srcfiles.py +13 -3
  8. omdev/amalg/gen/strip.py +1 -1
  9. omdev/amalg/gen/types.py +1 -1
  10. omdev/amalg/gen/typing.py +1 -1
  11. omdev/amalg/info.py +32 -0
  12. omdev/cache/data/actions.py +1 -1
  13. omdev/cache/data/specs.py +1 -1
  14. omdev/cexts/_boilerplate.cc +2 -3
  15. omdev/cexts/cmake.py +4 -1
  16. omdev/ci/cli.py +1 -2
  17. omdev/ci/github/api/v2/api.py +2 -0
  18. omdev/cmdlog/cli.py +1 -2
  19. omdev/dataclasses/_dumping.py +1960 -0
  20. omdev/dataclasses/_template.py +22 -0
  21. omdev/dataclasses/cli.py +6 -1
  22. omdev/dataclasses/codegen.py +340 -60
  23. omdev/dataclasses/dumping.py +200 -0
  24. omdev/interp/uv/provider.py +1 -0
  25. omdev/interp/venvs.py +1 -0
  26. omdev/irc/messages/base.py +50 -0
  27. omdev/irc/messages/formats.py +92 -0
  28. omdev/irc/messages/messages.py +775 -0
  29. omdev/irc/messages/parsing.py +99 -0
  30. omdev/irc/numerics/__init__.py +0 -0
  31. omdev/irc/numerics/formats.py +97 -0
  32. omdev/irc/numerics/numerics.py +865 -0
  33. omdev/irc/numerics/types.py +59 -0
  34. omdev/irc/protocol/LICENSE +11 -0
  35. omdev/irc/protocol/__init__.py +61 -0
  36. omdev/irc/protocol/consts.py +6 -0
  37. omdev/irc/protocol/errors.py +30 -0
  38. omdev/irc/protocol/message.py +21 -0
  39. omdev/irc/protocol/nuh.py +55 -0
  40. omdev/irc/protocol/parsing.py +158 -0
  41. omdev/irc/protocol/rendering.py +153 -0
  42. omdev/irc/protocol/tags.py +102 -0
  43. omdev/irc/protocol/utils.py +30 -0
  44. omdev/manifests/_dumping.py +125 -25
  45. omdev/markdown/__init__.py +0 -0
  46. omdev/markdown/incparse.py +116 -0
  47. omdev/markdown/tokens.py +51 -0
  48. omdev/packaging/marshal.py +8 -8
  49. omdev/packaging/requires.py +6 -6
  50. omdev/packaging/specifiers.py +2 -1
  51. omdev/packaging/versions.py +4 -4
  52. omdev/packaging/wheelfile.py +2 -0
  53. omdev/precheck/blanklines.py +66 -0
  54. omdev/precheck/caches.py +1 -1
  55. omdev/precheck/imports.py +14 -1
  56. omdev/precheck/main.py +4 -3
  57. omdev/precheck/unicode.py +39 -15
  58. omdev/py/asts/__init__.py +0 -0
  59. omdev/py/asts/parents.py +28 -0
  60. omdev/py/asts/toplevel.py +123 -0
  61. omdev/py/asts/visitors.py +18 -0
  62. omdev/py/attrdocs.py +6 -7
  63. omdev/py/bracepy.py +12 -4
  64. omdev/py/reprs.py +32 -0
  65. omdev/py/srcheaders.py +1 -1
  66. omdev/py/tokens/__init__.py +0 -0
  67. omdev/py/tools/mkrelimp.py +1 -1
  68. omdev/py/tools/pipdepup.py +629 -0
  69. omdev/pyproject/pkg.py +190 -45
  70. omdev/pyproject/reqs.py +31 -9
  71. omdev/pyproject/tools/__init__.py +0 -0
  72. omdev/pyproject/tools/aboutdeps.py +55 -0
  73. omdev/pyproject/venvs.py +8 -1
  74. omdev/rs/__init__.py +0 -0
  75. omdev/scripts/ci.py +400 -80
  76. omdev/scripts/interp.py +193 -35
  77. omdev/scripts/lib/__init__.py +0 -0
  78. omdev/scripts/{inject.py → lib/inject.py} +75 -28
  79. omdev/scripts/lib/logs.py +2079 -0
  80. omdev/scripts/{marshal.py → lib/marshal.py} +68 -26
  81. omdev/scripts/pyproject.py +941 -90
  82. omdev/tools/git/cli.py +12 -1
  83. omdev/tools/json/processing.py +5 -2
  84. omdev/tools/jsonview/cli.py +31 -5
  85. omdev/tools/pawk/pawk.py +2 -2
  86. omdev/tools/pip.py +8 -0
  87. omdev/tui/__init__.py +0 -0
  88. omdev/tui/apps/__init__.py +0 -0
  89. omdev/tui/apps/edit/__init__.py +0 -0
  90. omdev/tui/apps/edit/main.py +163 -0
  91. omdev/tui/apps/irc/__init__.py +0 -0
  92. omdev/tui/apps/irc/__main__.py +4 -0
  93. omdev/tui/apps/irc/app.py +278 -0
  94. omdev/tui/apps/irc/client.py +187 -0
  95. omdev/tui/apps/irc/commands.py +175 -0
  96. omdev/tui/apps/irc/main.py +26 -0
  97. omdev/tui/apps/markdown/__init__.py +0 -0
  98. omdev/tui/apps/markdown/__main__.py +11 -0
  99. omdev/{ptk → tui/apps}/markdown/cli.py +5 -7
  100. omdev/tui/rich/__init__.py +34 -0
  101. omdev/tui/rich/console2.py +20 -0
  102. omdev/tui/rich/markdown2.py +186 -0
  103. omdev/tui/textual/__init__.py +226 -0
  104. omdev/tui/textual/app2.py +11 -0
  105. omdev/tui/textual/autocomplete/LICENSE +21 -0
  106. omdev/tui/textual/autocomplete/__init__.py +33 -0
  107. omdev/tui/textual/autocomplete/matching.py +226 -0
  108. omdev/tui/textual/autocomplete/paths.py +202 -0
  109. omdev/tui/textual/autocomplete/widget.py +612 -0
  110. omdev/tui/textual/drivers2.py +55 -0
  111. {omdev-0.0.0.dev439.dist-info → omdev-0.0.0.dev486.dist-info}/METADATA +11 -9
  112. {omdev-0.0.0.dev439.dist-info → omdev-0.0.0.dev486.dist-info}/RECORD +121 -73
  113. omdev/ptk/__init__.py +0 -103
  114. omdev/ptk/apps/ncdu.py +0 -167
  115. omdev/ptk/confirm.py +0 -60
  116. omdev/ptk/markdown/LICENSE +0 -22
  117. omdev/ptk/markdown/__init__.py +0 -10
  118. omdev/ptk/markdown/__main__.py +0 -11
  119. omdev/ptk/markdown/border.py +0 -94
  120. omdev/ptk/markdown/markdown.py +0 -390
  121. omdev/ptk/markdown/parser.py +0 -42
  122. omdev/ptk/markdown/styles.py +0 -29
  123. omdev/ptk/markdown/tags.py +0 -299
  124. omdev/ptk/markdown/utils.py +0 -366
  125. omdev/pyproject/cexts.py +0 -110
  126. /omdev/{ptk/apps → irc}/__init__.py +0 -0
  127. /omdev/{tokens → irc/messages}/__init__.py +0 -0
  128. /omdev/{tokens → py/tokens}/all.py +0 -0
  129. /omdev/{tokens → py/tokens}/tokenizert.py +0 -0
  130. /omdev/{tokens → py/tokens}/utils.py +0 -0
  131. {omdev-0.0.0.dev439.dist-info → omdev-0.0.0.dev486.dist-info}/WHEEL +0 -0
  132. {omdev-0.0.0.dev439.dist-info → omdev-0.0.0.dev486.dist-info}/entry_points.txt +0 -0
  133. {omdev-0.0.0.dev439.dist-info → omdev-0.0.0.dev486.dist-info}/licenses/LICENSE +0 -0
  134. {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 ../../omlish/lite/marshal.py
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
- # check.py
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 update_abstracts(cls, *, force=False):
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: ta.Set[str] = set()
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 = {a: cls for a, o in cls.__dict__.items() if is_abstract_method(o)}
141
-
142
- seen = set(cls.__dict__)
143
- for b in cls.__bases__:
144
- ams.update({a: b for a in set(getattr(b, _ABSTRACT_METHODS_ATTR, [])) - seen}) # noqa
145
- seen.update(dir(b))
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
- *([m] if (m := getattr(c, '__module__')) else []),
153
- getattr(c, '__qualname__', getattr(c, '__name__')),
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, c in ams.items()
197
+ for a in ams
198
+ for c in [amd.get(a)]
157
199
  ])),
158
200
  )
159
201