ommlds 0.0.0.dev456__py3-none-any.whl → 0.0.0.dev485__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.
Files changed (212) hide show
  1. ommlds/.omlish-manifests.json +314 -33
  2. ommlds/__about__.py +15 -9
  3. ommlds/_hacks/__init__.py +4 -0
  4. ommlds/_hacks/funcs.py +110 -0
  5. ommlds/_hacks/names.py +158 -0
  6. ommlds/_hacks/params.py +73 -0
  7. ommlds/_hacks/patches.py +0 -3
  8. ommlds/backends/anthropic/protocol/__init__.py +13 -1
  9. ommlds/backends/anthropic/protocol/_dataclasses.py +1625 -0
  10. ommlds/backends/anthropic/protocol/sse/assemble.py +22 -6
  11. ommlds/backends/anthropic/protocol/sse/events.py +13 -0
  12. ommlds/backends/google/protocol/__init__.py +13 -0
  13. ommlds/backends/google/protocol/_dataclasses.py +5997 -0
  14. ommlds/backends/google/protocol/types.py +5 -1
  15. ommlds/backends/groq/__init__.py +7 -0
  16. ommlds/backends/groq/_dataclasses.py +3901 -0
  17. ommlds/backends/groq/_marshal.py +23 -0
  18. ommlds/backends/groq/protocol.py +249 -0
  19. ommlds/backends/llamacpp/logging.py +4 -1
  20. ommlds/backends/mlx/caching.py +7 -3
  21. ommlds/backends/mlx/cli.py +10 -7
  22. ommlds/backends/mlx/generation.py +18 -16
  23. ommlds/backends/mlx/limits.py +10 -6
  24. ommlds/backends/mlx/loading.py +65 -5
  25. ommlds/backends/ollama/__init__.py +7 -0
  26. ommlds/backends/ollama/_dataclasses.py +3458 -0
  27. ommlds/backends/ollama/protocol.py +170 -0
  28. ommlds/backends/openai/protocol/__init__.py +15 -1
  29. ommlds/backends/openai/protocol/_dataclasses.py +7708 -0
  30. ommlds/backends/tavily/__init__.py +7 -0
  31. ommlds/backends/tavily/_dataclasses.py +1734 -0
  32. ommlds/backends/tavily/protocol.py +301 -0
  33. ommlds/backends/tinygrad/models/llama3/__init__.py +22 -14
  34. ommlds/backends/transformers/__init__.py +14 -0
  35. ommlds/backends/transformers/filecache.py +109 -0
  36. ommlds/backends/transformers/streamers.py +73 -0
  37. ommlds/cli/__init__.py +7 -0
  38. ommlds/cli/_dataclasses.py +2562 -0
  39. ommlds/cli/asyncs.py +30 -0
  40. ommlds/cli/backends/catalog.py +93 -0
  41. ommlds/cli/backends/configs.py +9 -0
  42. ommlds/cli/backends/inject.py +31 -36
  43. ommlds/cli/backends/injection.py +16 -0
  44. ommlds/cli/backends/types.py +46 -0
  45. ommlds/cli/content/messages.py +34 -0
  46. ommlds/cli/content/strings.py +42 -0
  47. ommlds/cli/inject.py +15 -32
  48. ommlds/cli/inputs/__init__.py +0 -0
  49. ommlds/cli/inputs/asyncs.py +32 -0
  50. ommlds/cli/inputs/sync.py +75 -0
  51. ommlds/cli/main.py +267 -128
  52. ommlds/cli/rendering/__init__.py +0 -0
  53. ommlds/cli/rendering/configs.py +9 -0
  54. ommlds/cli/rendering/inject.py +31 -0
  55. ommlds/cli/rendering/markdown.py +52 -0
  56. ommlds/cli/rendering/raw.py +73 -0
  57. ommlds/cli/rendering/types.py +21 -0
  58. ommlds/cli/secrets.py +21 -0
  59. ommlds/cli/sessions/base.py +1 -1
  60. ommlds/cli/sessions/chat/chat/__init__.py +0 -0
  61. ommlds/cli/sessions/chat/chat/ai/__init__.py +0 -0
  62. ommlds/cli/sessions/chat/chat/ai/configs.py +11 -0
  63. ommlds/cli/sessions/chat/chat/ai/inject.py +74 -0
  64. ommlds/cli/sessions/chat/chat/ai/injection.py +14 -0
  65. ommlds/cli/sessions/chat/chat/ai/rendering.py +70 -0
  66. ommlds/cli/sessions/chat/chat/ai/services.py +79 -0
  67. ommlds/cli/sessions/chat/chat/ai/tools.py +44 -0
  68. ommlds/cli/sessions/chat/chat/ai/types.py +28 -0
  69. ommlds/cli/sessions/chat/chat/state/__init__.py +0 -0
  70. ommlds/cli/sessions/chat/chat/state/configs.py +11 -0
  71. ommlds/cli/sessions/chat/chat/state/inject.py +36 -0
  72. ommlds/cli/sessions/chat/chat/state/inmemory.py +33 -0
  73. ommlds/cli/sessions/chat/chat/state/storage.py +52 -0
  74. ommlds/cli/sessions/chat/chat/state/types.py +38 -0
  75. ommlds/cli/sessions/chat/chat/user/__init__.py +0 -0
  76. ommlds/cli/sessions/chat/chat/user/configs.py +17 -0
  77. ommlds/cli/sessions/chat/chat/user/inject.py +62 -0
  78. ommlds/cli/sessions/chat/chat/user/interactive.py +31 -0
  79. ommlds/cli/sessions/chat/chat/user/oneshot.py +25 -0
  80. ommlds/cli/sessions/chat/chat/user/types.py +15 -0
  81. ommlds/cli/sessions/chat/configs.py +27 -0
  82. ommlds/cli/sessions/chat/driver.py +43 -0
  83. ommlds/cli/sessions/chat/inject.py +33 -65
  84. ommlds/cli/sessions/chat/phases/__init__.py +0 -0
  85. ommlds/cli/sessions/chat/phases/inject.py +27 -0
  86. ommlds/cli/sessions/chat/phases/injection.py +14 -0
  87. ommlds/cli/sessions/chat/phases/manager.py +29 -0
  88. ommlds/cli/sessions/chat/phases/types.py +29 -0
  89. ommlds/cli/sessions/chat/session.py +27 -0
  90. ommlds/cli/sessions/chat/tools/__init__.py +0 -0
  91. ommlds/cli/sessions/chat/tools/configs.py +22 -0
  92. ommlds/cli/sessions/chat/tools/confirmation.py +46 -0
  93. ommlds/cli/sessions/chat/tools/execution.py +66 -0
  94. ommlds/cli/sessions/chat/tools/fs/__init__.py +0 -0
  95. ommlds/cli/sessions/chat/tools/fs/configs.py +12 -0
  96. ommlds/cli/sessions/chat/tools/fs/inject.py +35 -0
  97. ommlds/cli/sessions/chat/tools/inject.py +88 -0
  98. ommlds/cli/sessions/chat/tools/injection.py +44 -0
  99. ommlds/cli/sessions/chat/tools/rendering.py +58 -0
  100. ommlds/cli/sessions/chat/tools/todo/__init__.py +0 -0
  101. ommlds/cli/sessions/chat/tools/todo/configs.py +12 -0
  102. ommlds/cli/sessions/chat/tools/todo/inject.py +31 -0
  103. ommlds/cli/sessions/chat/tools/weather/__init__.py +0 -0
  104. ommlds/cli/sessions/chat/tools/weather/configs.py +12 -0
  105. ommlds/cli/sessions/chat/tools/weather/inject.py +22 -0
  106. ommlds/cli/{tools/weather.py → sessions/chat/tools/weather/tools.py} +1 -1
  107. ommlds/cli/sessions/completion/configs.py +21 -0
  108. ommlds/cli/sessions/completion/inject.py +42 -0
  109. ommlds/cli/sessions/completion/session.py +35 -0
  110. ommlds/cli/sessions/embedding/configs.py +21 -0
  111. ommlds/cli/sessions/embedding/inject.py +42 -0
  112. ommlds/cli/sessions/embedding/session.py +33 -0
  113. ommlds/cli/sessions/inject.py +28 -11
  114. ommlds/cli/state/__init__.py +0 -0
  115. ommlds/cli/state/inject.py +28 -0
  116. ommlds/cli/{state.py → state/storage.py} +41 -24
  117. ommlds/minichain/__init__.py +46 -17
  118. ommlds/minichain/_dataclasses.py +15401 -0
  119. ommlds/minichain/backends/catalogs/base.py +20 -1
  120. ommlds/minichain/backends/catalogs/simple.py +2 -2
  121. ommlds/minichain/backends/catalogs/strings.py +10 -8
  122. ommlds/minichain/backends/impls/anthropic/chat.py +31 -65
  123. ommlds/minichain/backends/impls/anthropic/names.py +3 -4
  124. ommlds/minichain/backends/impls/anthropic/protocol.py +109 -0
  125. ommlds/minichain/backends/impls/anthropic/stream.py +53 -31
  126. ommlds/minichain/backends/impls/duckduckgo/search.py +5 -1
  127. ommlds/minichain/backends/impls/dummy/__init__.py +0 -0
  128. ommlds/minichain/backends/impls/dummy/chat.py +69 -0
  129. ommlds/minichain/backends/impls/google/chat.py +9 -2
  130. ommlds/minichain/backends/impls/google/search.py +6 -1
  131. ommlds/minichain/backends/impls/google/stream.py +122 -32
  132. ommlds/minichain/backends/impls/groq/__init__.py +0 -0
  133. ommlds/minichain/backends/impls/groq/chat.py +75 -0
  134. ommlds/minichain/backends/impls/groq/names.py +48 -0
  135. ommlds/minichain/backends/impls/groq/protocol.py +143 -0
  136. ommlds/minichain/backends/impls/groq/stream.py +125 -0
  137. ommlds/minichain/backends/impls/huggingface/repos.py +1 -5
  138. ommlds/minichain/backends/impls/llamacpp/chat.py +15 -3
  139. ommlds/minichain/backends/impls/llamacpp/completion.py +7 -3
  140. ommlds/minichain/backends/impls/llamacpp/stream.py +38 -19
  141. ommlds/minichain/backends/impls/mistral.py +9 -2
  142. ommlds/minichain/backends/impls/mlx/chat.py +100 -23
  143. ommlds/minichain/backends/impls/ollama/__init__.py +0 -0
  144. ommlds/minichain/backends/impls/ollama/chat.py +199 -0
  145. ommlds/minichain/backends/impls/openai/chat.py +14 -7
  146. ommlds/minichain/backends/impls/openai/completion.py +9 -2
  147. ommlds/minichain/backends/impls/openai/embedding.py +9 -2
  148. ommlds/minichain/backends/impls/openai/format.py +115 -109
  149. ommlds/minichain/backends/impls/openai/names.py +31 -5
  150. ommlds/minichain/backends/impls/openai/stream.py +33 -27
  151. ommlds/minichain/backends/impls/sentencepiece/tokens.py +9 -6
  152. ommlds/minichain/backends/impls/tavily.py +66 -0
  153. ommlds/minichain/backends/impls/tinygrad/chat.py +17 -14
  154. ommlds/minichain/backends/impls/tokenizers/tokens.py +9 -6
  155. ommlds/minichain/backends/impls/transformers/sentence.py +5 -2
  156. ommlds/minichain/backends/impls/transformers/tokens.py +10 -7
  157. ommlds/minichain/backends/impls/transformers/transformers.py +139 -20
  158. ommlds/minichain/backends/strings/parsing.py +1 -1
  159. ommlds/minichain/backends/strings/resolving.py +4 -1
  160. ommlds/minichain/chat/choices/stream/__init__.py +0 -0
  161. ommlds/minichain/chat/choices/stream/adapters.py +35 -0
  162. ommlds/minichain/chat/choices/stream/joining.py +31 -0
  163. ommlds/minichain/chat/choices/stream/services.py +45 -0
  164. ommlds/minichain/chat/choices/stream/types.py +43 -0
  165. ommlds/minichain/chat/stream/_marshal.py +4 -4
  166. ommlds/minichain/chat/stream/joining.py +85 -0
  167. ommlds/minichain/chat/stream/services.py +15 -15
  168. ommlds/minichain/chat/stream/types.py +24 -18
  169. ommlds/minichain/llms/types.py +4 -0
  170. ommlds/minichain/registries/globals.py +18 -4
  171. ommlds/minichain/resources.py +28 -3
  172. ommlds/minichain/search.py +1 -1
  173. ommlds/minichain/standard.py +8 -0
  174. ommlds/minichain/stream/services.py +19 -16
  175. ommlds/minichain/tools/reflect.py +5 -1
  176. ommlds/nanochat/LICENSE +21 -0
  177. ommlds/nanochat/__init__.py +0 -0
  178. ommlds/nanochat/rustbpe/LICENSE +21 -0
  179. ommlds/nanochat/tokenizers.py +406 -0
  180. ommlds/specs/__init__.py +0 -0
  181. ommlds/specs/mcp/__init__.py +0 -0
  182. ommlds/specs/mcp/_marshal.py +23 -0
  183. ommlds/specs/mcp/clients.py +146 -0
  184. ommlds/specs/mcp/protocol.py +371 -0
  185. ommlds/tools/git.py +13 -6
  186. ommlds/tools/ocr.py +1 -8
  187. ommlds/wiki/analyze.py +2 -2
  188. ommlds/wiki/text/mfh.py +1 -5
  189. ommlds/wiki/text/wtp.py +1 -3
  190. ommlds/wiki/utils/xml.py +5 -5
  191. {ommlds-0.0.0.dev456.dist-info → ommlds-0.0.0.dev485.dist-info}/METADATA +22 -19
  192. {ommlds-0.0.0.dev456.dist-info → ommlds-0.0.0.dev485.dist-info}/RECORD +198 -95
  193. ommlds/cli/backends/standard.py +0 -20
  194. ommlds/cli/sessions/chat/base.py +0 -42
  195. ommlds/cli/sessions/chat/code.py +0 -129
  196. ommlds/cli/sessions/chat/interactive.py +0 -71
  197. ommlds/cli/sessions/chat/printing.py +0 -97
  198. ommlds/cli/sessions/chat/prompt.py +0 -151
  199. ommlds/cli/sessions/chat/state.py +0 -110
  200. ommlds/cli/sessions/chat/tools.py +0 -100
  201. ommlds/cli/sessions/completion/completion.py +0 -44
  202. ommlds/cli/sessions/embedding/embedding.py +0 -42
  203. ommlds/cli/tools/config.py +0 -14
  204. ommlds/cli/tools/inject.py +0 -75
  205. ommlds/minichain/backends/impls/openai/format2.py +0 -210
  206. ommlds/minichain/chat/stream/adapters.py +0 -80
  207. /ommlds/{huggingface.py → backends/huggingface.py} +0 -0
  208. /ommlds/cli/{tools → content}/__init__.py +0 -0
  209. {ommlds-0.0.0.dev456.dist-info → ommlds-0.0.0.dev485.dist-info}/WHEEL +0 -0
  210. {ommlds-0.0.0.dev456.dist-info → ommlds-0.0.0.dev485.dist-info}/entry_points.txt +0 -0
  211. {ommlds-0.0.0.dev456.dist-info → ommlds-0.0.0.dev485.dist-info}/licenses/LICENSE +0 -0
  212. {ommlds-0.0.0.dev456.dist-info → ommlds-0.0.0.dev485.dist-info}/top_level.txt +0 -0
ommlds/_hacks/funcs.py ADDED
@@ -0,0 +1,110 @@
1
+ import dataclasses as dc
2
+ import linecache
3
+ import textwrap
4
+ import threading
5
+ import types
6
+ import typing as ta
7
+ import uuid
8
+ import warnings
9
+
10
+ from omlish import check
11
+ from omlish import lang
12
+
13
+ from .names import NamespaceBuilder
14
+ from .params import render_param_spec_call
15
+ from .params import render_param_spec_def
16
+
17
+
18
+ ##
19
+
20
+
21
+ @dc.dataclass()
22
+ class _ReservedFilenameEntry:
23
+ unique_id: str
24
+ seq: int = 0
25
+
26
+
27
+ _RESERVED_FILENAME_UUID_TLS = threading.local()
28
+
29
+
30
+ def reserve_linecache_filename(prefix: str) -> str:
31
+ try:
32
+ e = _RESERVED_FILENAME_UUID_TLS.unique_id
33
+ except AttributeError:
34
+ e = _RESERVED_FILENAME_UUID_TLS.unique_id = _ReservedFilenameEntry(str(uuid.uuid4()))
35
+
36
+ while True:
37
+ unique_filename = f'<generated:{prefix}:{e.seq}>'
38
+ cache_line = (1, None, (e.unique_id,), unique_filename)
39
+ e.seq += 1
40
+ if linecache.cache.setdefault(unique_filename, cache_line) == cache_line: # type: ignore
41
+ return unique_filename
42
+
43
+
44
+ ##
45
+
46
+
47
+ def create_function(
48
+ name: str,
49
+ params: lang.CanParamSpec,
50
+ body: str,
51
+ *,
52
+ globals: ta.Mapping[str, ta.Any] | None = None, # noqa
53
+ locals: ta.Mapping[str, ta.Any] | None = None, # noqa
54
+ indent: str = ' ',
55
+ ) -> types.FunctionType:
56
+ params = lang.ParamSpec.of(params)
57
+ check.isinstance(body, str)
58
+ locals = dict(locals or {}) # noqa
59
+
60
+ nsb = NamespaceBuilder(reserved_names=set(locals) | set(globals or []))
61
+ sig = render_param_spec_def(params, nsb)
62
+ for k, v in nsb.items():
63
+ check.not_in(k, locals)
64
+ locals[k] = v
65
+
66
+ body_txt = '\n'.join([
67
+ f'def {name}{sig}:',
68
+ textwrap.indent(textwrap.dedent(body.strip()), indent),
69
+ ])
70
+
71
+ exec_txt = '\n'.join([
72
+ f'def __create_fn__({", ".join(locals.keys())}):',
73
+ textwrap.indent(body_txt, indent),
74
+ f'{indent}return {name}',
75
+ ])
76
+
77
+ ns: dict = {}
78
+ filename = reserve_linecache_filename(name)
79
+ bytecode = compile(exec_txt, filename, 'exec')
80
+ eval(bytecode, globals or {}, ns) # type: ignore # noqa
81
+
82
+ fn = ns['__create_fn__'](**locals)
83
+ fn.__source__ = body_txt
84
+ linecache.cache[filename] = (len(exec_txt), None, exec_txt.splitlines(True), filename)
85
+ return fn
86
+
87
+
88
+ ##
89
+
90
+
91
+ def create_detour(
92
+ params: lang.CanParamSpec,
93
+ target: ta.Callable,
94
+ *,
95
+ as_kwargs: bool = False,
96
+ ) -> types.CodeType:
97
+ params = lang.ParamSpec.of(params)
98
+ check.callable(target)
99
+
100
+ with warnings.catch_warnings():
101
+ warnings.filterwarnings('ignore', category=SyntaxWarning)
102
+
103
+ gfn = create_function(
104
+ '_',
105
+ params,
106
+ f'return 1{render_param_spec_call(params, as_kwargs=as_kwargs)}',
107
+ )
108
+
109
+ check.state(gfn.__code__.co_consts[:2] == (None, 1))
110
+ return gfn.__code__.replace(co_consts=(None, target, *gfn.__code__.co_consts[2:]))
ommlds/_hacks/names.py ADDED
@@ -0,0 +1,158 @@
1
+ """
2
+ TODO:
3
+ - releaseable names
4
+ """
5
+ import string
6
+ import typing as ta
7
+
8
+ from omlish import check
9
+ from omlish import collections as col
10
+
11
+
12
+ ##
13
+
14
+
15
+ class NameGenerator(ta.Protocol):
16
+ def __call__(self, prefix: str = '') -> str: ...
17
+
18
+
19
+ #
20
+
21
+
22
+ class NameGeneratorImpl:
23
+ DEFAULT_PREFIX: ta.ClassVar[str] = '_'
24
+
25
+ def __init__(
26
+ self,
27
+ *,
28
+ reserved_names: ta.Iterable[str] | None = None,
29
+ global_prefix: str | None = None,
30
+ use_global_prefix_if_present: bool = False,
31
+ add_global_prefix_before_number: bool = False,
32
+ ) -> None:
33
+ super().__init__()
34
+
35
+ check.arg(not isinstance(reserved_names, str))
36
+ self._reserved_names = {check.isinstance(n, str) for n in (reserved_names or [])}
37
+ self._global_prefix = global_prefix if global_prefix is not None else self.DEFAULT_PREFIX
38
+ self._use_global_prefix_if_present = bool(use_global_prefix_if_present)
39
+ self._add_global_prefix_before_number = bool(add_global_prefix_before_number)
40
+
41
+ self._name_counts: dict[str, int] = {}
42
+
43
+ def __call__(self, prefix: str = '') -> str:
44
+ if self._use_global_prefix_if_present and prefix.startswith(self._global_prefix):
45
+ base_name = prefix
46
+ else:
47
+ base_name = self._global_prefix + prefix
48
+
49
+ base_count = -1
50
+ if base_name[-1] in string.digits:
51
+ i = len(base_name) - 2
52
+ while i >= 0 and base_name[i] in string.digits:
53
+ i -= 1
54
+ i += 1
55
+ base_count = int(base_name[i:])
56
+ base_name = base_name[:i]
57
+
58
+ if self._add_global_prefix_before_number:
59
+ if not (self._use_global_prefix_if_present and base_name.endswith(self._global_prefix)):
60
+ base_name += self._global_prefix
61
+
62
+ if base_count >= 0:
63
+ count = self._name_counts.setdefault(base_name, 0)
64
+ if base_count > count:
65
+ self._name_counts[base_name] = base_count
66
+
67
+ while True:
68
+ count = self._name_counts.get(base_name, 0)
69
+ self._name_counts[base_name] = count + 1
70
+ name = base_name + str(count)
71
+ if name not in self._reserved_names:
72
+ return name
73
+
74
+
75
+ name_generator = NameGeneratorImpl
76
+
77
+
78
+ ##
79
+
80
+
81
+ class NamespaceBuilder(ta.Mapping[str, ta.Any]):
82
+ def __init__(
83
+ self,
84
+ *,
85
+ reserved_names: ta.Iterable[str] | None = None,
86
+ name_generator: NameGenerator | None = None, # noqa
87
+ ) -> None:
88
+ super().__init__()
89
+
90
+ self._reserved_names = {
91
+ check.isinstance(n, str)
92
+ for n in (check.not_isinstance(reserved_names, str) or [])
93
+ }
94
+ self._name_generator = check.callable(name_generator) if name_generator is not None else \
95
+ NameGeneratorImpl(reserved_names=self._reserved_names, use_global_prefix_if_present=True)
96
+
97
+ self._dct: ta.MutableMapping[str, ta.Any] = {}
98
+ self._dedupe_dct: ta.MutableMapping[ta.Any, str] = col.IdentityKeyDict()
99
+
100
+ @property
101
+ def reserved_names(self) -> ta.AbstractSet[str]:
102
+ return self._reserved_names
103
+
104
+ @property
105
+ def name_generator(self) -> NameGenerator:
106
+ return self._name_generator
107
+
108
+ def __getitem__(self, k: str) -> ta.Any:
109
+ return self._dct[k]
110
+
111
+ def __len__(self):
112
+ return len(self._dct)
113
+
114
+ def __iter__(self) -> ta.Iterator[str]:
115
+ return iter(self._dct)
116
+
117
+ def items(self) -> ta.ItemsView[str, ta.Any]:
118
+ return self._dct.items()
119
+
120
+ def put(
121
+ self,
122
+ value: ta.Any,
123
+ name: str | None = None,
124
+ *,
125
+ exact: bool = False,
126
+ dedupe: bool = False,
127
+ ) -> str:
128
+ check.arg(not (name is None and exact))
129
+ if name is not None:
130
+ check.isinstance(name, str)
131
+
132
+ if dedupe:
133
+ try:
134
+ return self._dedupe_dct[value]
135
+ except KeyError:
136
+ pass
137
+
138
+ if name is not None:
139
+ if name not in self._reserved_names:
140
+ try:
141
+ existing = self._dct[name]
142
+ except KeyError:
143
+ self._dct[name] = value
144
+ if dedupe:
145
+ self._dedupe_dct[value] = name
146
+ return name
147
+ else:
148
+ if existing is value:
149
+ return name
150
+ if exact:
151
+ raise KeyError(name)
152
+
153
+ gen_name = self._name_generator(name or '')
154
+ check.not_in(gen_name, self._dct)
155
+ self._dct[gen_name] = value
156
+ if dedupe:
157
+ self._dedupe_dct[value] = gen_name
158
+ return gen_name
@@ -0,0 +1,73 @@
1
+ import typing as ta
2
+
3
+ from omlish import lang
4
+
5
+ from .names import NamespaceBuilder
6
+
7
+
8
+ ##
9
+
10
+
11
+ def render_param_spec_call(
12
+ params: lang.ParamSpec,
13
+ *,
14
+ as_kwargs: bool = False,
15
+ ) -> str:
16
+ src = ['(']
17
+
18
+ for i, p in enumerate(params):
19
+ if isinstance(p, lang.ParamSeparator):
20
+ continue
21
+
22
+ if i:
23
+ src.append(', ')
24
+
25
+ if as_kwargs:
26
+ if isinstance(p, lang.Param):
27
+ src.append(f'{p.name}={p.name}')
28
+ else:
29
+ raise TypeError(p)
30
+
31
+ else:
32
+ if isinstance(p, lang.ArgsParam):
33
+ src.append(f'*{p.name}')
34
+ elif isinstance(p, lang.KwargsParam):
35
+ src.append(f'**{p.name}')
36
+ elif isinstance(p, lang.PosOnlyParam):
37
+ src.append(p.name)
38
+ elif isinstance(p, lang.KwOnlyParam):
39
+ src.append(f'{p.name}={p.name}')
40
+ elif isinstance(p, lang.ValParam):
41
+ src.append(p.name)
42
+ else:
43
+ raise TypeError(p)
44
+
45
+ src.append(')')
46
+
47
+ return ''.join(src)
48
+
49
+
50
+ def render_param_spec_def(
51
+ params: lang.ParamSpec,
52
+ nsb: NamespaceBuilder,
53
+ *,
54
+ return_ann: lang.Maybe[ta.Any] = lang.empty(),
55
+ ) -> str:
56
+ src = ['(']
57
+
58
+ for i, p in enumerate(params):
59
+ if i:
60
+ src.append(', ')
61
+
62
+ src.append(lang.param_render(
63
+ p,
64
+ render_annotation=lambda ann: nsb.put(ann, f'ann_{p.name}'), # noqa
65
+ render_default=lambda dfl: nsb.put(dfl, f'dfl_{p.name}'), # noqa
66
+ ))
67
+
68
+ src.append(')')
69
+
70
+ if return_ann.present:
71
+ src.append(f' -> {nsb.put(return_ann.must(), "ann_return")}')
72
+
73
+ return ''.join(src)
ommlds/_hacks/patches.py CHANGED
@@ -1,7 +1,4 @@
1
1
  """
2
- Currently, and ideally, the only thing this codebase will ever interact with requiring these kinds of awful hacks is ML
3
- code - thus these 'helpers' are kept here, not in the core library.
4
-
5
2
  TODO:
6
3
  - patch lock
7
4
  - thread / context local gating
@@ -1,9 +1,21 @@
1
+ from omlish import dataclasses as _dc # noqa
2
+
3
+
4
+ _dc.init_package(
5
+ globals(),
6
+ codegen=True,
7
+ )
8
+
9
+
10
+ ##
11
+
12
+
1
13
  from . import types # noqa
2
14
 
3
15
 
4
16
  ##
5
17
 
6
18
 
7
- from omlish import marshal as _msh
19
+ from omlish import marshal as _msh # noqa
8
20
 
9
21
  _msh.register_global_module_import('._marshal', __package__)