omlish 0.0.0.dev317__py3-none-any.whl → 0.0.0.dev318__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.
omlish/__about__.py CHANGED
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev317'
2
- __revision__ = 'fde65227a86537b0442352985307b74b7376b98e'
1
+ __version__ = '0.0.0.dev318'
2
+ __revision__ = 'b80bceb394abe03974e4312775224ac1dbcb5b22'
3
3
 
4
4
 
5
5
  #
@@ -103,7 +103,7 @@ class Project(ProjectBase):
103
103
 
104
104
  'sqlean.py ~= 3.49',
105
105
 
106
- 'duckdb ~= 1.2',
106
+ 'duckdb ~= 1.3',
107
107
  ],
108
108
 
109
109
  'templates': [
@@ -12,6 +12,8 @@ from ...specs import FieldSpec
12
12
  def std_params_to_class_spec(
13
13
  p: StdParams,
14
14
  fields: ta.Sequence[FieldSpec],
15
+ *,
16
+ metadata: ta.Sequence[ta.Any] | None = None,
15
17
  ) -> ClassSpec:
16
18
  return ClassSpec(
17
19
  fields=fields,
@@ -27,4 +29,6 @@ def std_params_to_class_spec(
27
29
  kw_only=check.isinstance(p.kw_only, bool),
28
30
  slots=check.isinstance(p.slots, bool),
29
31
  weakref_slot=check.isinstance(p.weakref_slot, bool),
32
+
33
+ metadata=metadata,
30
34
  )
@@ -3,6 +3,7 @@ import typing as ta
3
3
 
4
4
  from .. import lang
5
5
  from .api.classes.conversion import std_params_to_class_spec
6
+ from .api.classes.metadata import extract_cls_metadata
6
7
  from .api.classes.params import get_class_spec
7
8
  from .api.fields.conversion import std_field_to_field_spec
8
9
  from .concerns.fields import InitFields
@@ -49,9 +50,12 @@ class ClassReflection:
49
50
  for f in dc.fields(self._cls) # noqa
50
51
  ]
51
52
 
53
+ cmd = extract_cls_metadata(self._cls, deep=True)
54
+
52
55
  cs = std_params_to_class_spec(
53
56
  p,
54
57
  fsl,
58
+ metadata=cmd.user_metadata or None,
55
59
  )
56
60
 
57
61
  return cs
@@ -59,6 +59,9 @@ class _cached_nullary: # noqa
59
59
  #
60
60
 
61
61
 
62
+ _repr = repr
63
+
64
+
62
65
  def _attr_repr(obj, *atts):
63
66
  return f'{obj.__class__.__name__}({", ".join(f"{a}={getattr(obj, a)!r}" for a in atts)})'
64
67
 
@@ -127,6 +130,109 @@ class AsJson:
127
130
  ##
128
131
 
129
132
 
133
+ class SysModule(AttrsClass, AsJson):
134
+ def __init__(
135
+ self,
136
+ name, # type: str
137
+ *,
138
+ seq=None, # type: int | None
139
+ repr=None, # type: str | None # noqa
140
+
141
+ origin=None, # type: str | None
142
+ file=None, # type: str | None
143
+ ) -> None:
144
+ super().__init__()
145
+
146
+ self._name = name
147
+
148
+ self._seq = seq
149
+ self._repr = repr
150
+
151
+ self._origin = origin
152
+ self._file = file
153
+
154
+ __attrs__ = (
155
+ 'name',
156
+
157
+ 'seq',
158
+ 'repr',
159
+
160
+ 'origin',
161
+ 'file',
162
+ )
163
+
164
+ @property
165
+ def name(self): # type: () -> str
166
+ return self._name
167
+
168
+ @property
169
+ def seq(self): # type: () -> int | None
170
+ return self._seq
171
+
172
+ @property
173
+ def repr(self): # type: () -> str | None
174
+ return self._repr
175
+
176
+ @property
177
+ def origin(self): # type: () -> str | None
178
+ return self._origin
179
+
180
+ @property
181
+ def file(self): # type: () -> str | None
182
+ return self._file
183
+
184
+ def as_json(self): # type: () -> dict[str, object]
185
+ return self.attrs_dict()
186
+
187
+
188
+ def build_sys_module(
189
+ name, # type: str
190
+ mod,
191
+ *,
192
+ seq=None, # type: int | None
193
+ ) -> SysModule:
194
+ kwargs = dict() # type: dict
195
+ kwargs.update(
196
+ name=name,
197
+
198
+ seq=seq,
199
+ repr=_repr(mod),
200
+ )
201
+
202
+ try:
203
+ spec = mod.__spec__
204
+ except AttributeError:
205
+ pass
206
+ else:
207
+ if spec is not None:
208
+ kwargs.update(origin=spec.origin)
209
+
210
+ try:
211
+ file = mod.__file__
212
+ except AttributeError:
213
+ pass
214
+ else:
215
+ kwargs.update(file=file)
216
+
217
+ return SysModule(**kwargs)
218
+
219
+
220
+ def build_sys_modules(dct=None): # type: (dict[str, object] | None) -> list[SysModule]
221
+ if dct is None:
222
+ dct_ = sys.modules
223
+ else:
224
+ dct_ = dct # type: ignore
225
+
226
+ lst = [] # type: list[SysModule]
227
+ for i, (n, m) in enumerate(dct_.items()):
228
+ lst.append(build_sys_module(n, m, seq=i))
229
+
230
+ return lst
231
+
232
+
233
+ ##
234
+
235
+
130
236
  class RunEnv(AttrsClass, AsJson):
131
237
  def __init__(
132
238
  self,
@@ -143,6 +249,7 @@ class RunEnv(AttrsClass, AsJson):
143
249
  pycharm_hosted=None, # type: bool | None
144
250
 
145
251
  sys_path=None, # type: list[str] | None
252
+ sys_modules=None, # type: list[SysModule] | None
146
253
  ) -> None:
147
254
  super().__init__()
148
255
 
@@ -182,6 +289,10 @@ class RunEnv(AttrsClass, AsJson):
182
289
  sys_path = list(sys.path)
183
290
  self._sys_path = sys_path
184
291
 
292
+ if sys_modules is None:
293
+ sys_modules = build_sys_modules()
294
+ self._sys_modules = sys_modules
295
+
185
296
  __attrs__ = (
186
297
  'argv',
187
298
  'orig_argv',
@@ -195,6 +306,7 @@ class RunEnv(AttrsClass, AsJson):
195
306
  'pycharm_hosted',
196
307
 
197
308
  'sys_path',
309
+ 'sys_modules',
198
310
  )
199
311
 
200
312
  @property
@@ -233,8 +345,15 @@ class RunEnv(AttrsClass, AsJson):
233
345
  def sys_path(self): # type: () -> list[str]
234
346
  return self._sys_path
235
347
 
348
+ @property
349
+ def sys_modules(self): # type: () -> list[SysModule]
350
+ return self._sys_modules
351
+
236
352
  def as_json(self): # type: () -> dict[str, object]
237
- return self.attrs_dict()
353
+ return {
354
+ **self.attrs_dict(),
355
+ 'sys_modules': [m.as_json() for m in self.sys_modules],
356
+ }
238
357
 
239
358
 
240
359
  ##
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omlish
3
- Version: 0.0.0.dev317
3
+ Version: 0.0.0.dev318
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -41,7 +41,7 @@ Requires-Dist: aiosqlite~=0.21; extra == "all"
41
41
  Requires-Dist: asyncpg~=0.30; extra == "all"
42
42
  Requires-Dist: apsw~=3.49; extra == "all"
43
43
  Requires-Dist: sqlean.py~=3.49; extra == "all"
44
- Requires-Dist: duckdb~=1.2; extra == "all"
44
+ Requires-Dist: duckdb~=1.3; extra == "all"
45
45
  Requires-Dist: markupsafe~=3.0; extra == "all"
46
46
  Requires-Dist: jinja2~=3.1; extra == "all"
47
47
  Requires-Dist: pytest~=8.3; extra == "all"
@@ -89,7 +89,7 @@ Requires-Dist: aiosqlite~=0.21; extra == "sqldrivers"
89
89
  Requires-Dist: asyncpg~=0.30; extra == "sqldrivers"
90
90
  Requires-Dist: apsw~=3.49; extra == "sqldrivers"
91
91
  Requires-Dist: sqlean.py~=3.49; extra == "sqldrivers"
92
- Requires-Dist: duckdb~=1.2; extra == "sqldrivers"
92
+ Requires-Dist: duckdb~=1.3; extra == "sqldrivers"
93
93
  Provides-Extra: templates
94
94
  Requires-Dist: markupsafe~=3.0; extra == "templates"
95
95
  Requires-Dist: jinja2~=3.1; extra == "templates"
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=orgsRvtpHu8tdhaCvlP9v3P495OJopYYiHKjK68WtWg,8587
2
- omlish/__about__.py,sha256=XvJduE7LyT8sT8wf4Tcj6mGwYJh0_bub6Rmk7aliJpA,3478
2
+ omlish/__about__.py,sha256=kisuBtrw4R5wrzm5nluakJkzLD7HYXcYuB7zYWAgrQc,3478
3
3
  omlish/__init__.py,sha256=SsyiITTuK0v74XpKV8dqNaCmjOlan1JZKrHQv5rWKPA,253
4
4
  omlish/c3.py,sha256=rer-TPOFDU6fYq_AWio_AmA-ckZ8JDY5shIzQ_yXfzA,8414
5
5
  omlish/cached.py,sha256=MLap_p0rdGoDIMVhXVHm1tsbcWobJF0OanoodV03Ju8,542
@@ -139,12 +139,12 @@ omlish/dataclasses/debug.py,sha256=giBiv6aXvX0IagwNCW64qBzNjfOFr3-VmgDy_KYlb-k,2
139
139
  omlish/dataclasses/errors.py,sha256=tyv3WR6az66uGGiq9FIuCHvy1Ef-G7zeMY7mMG6hy2Y,2527
140
140
  omlish/dataclasses/inspect.py,sha256=BlpPghVCU3w_YDnONEqqE99YHzJM2q3eoqe39YX25Ko,4596
141
141
  omlish/dataclasses/internals.py,sha256=vIGCZnStgD3ef4drYRtVOrxhxmAPa0vJpo4pXcDcQvM,3073
142
- omlish/dataclasses/reflection.py,sha256=5N4acL27xwSnQJvoks6ts2JseGfwL_P9D2gM9vqtAFM,2243
142
+ omlish/dataclasses/reflection.py,sha256=FSSTiS7pGTmDrYNkS6fZzaMSe8qtSvDv5Pgz0T55qXg,2404
143
143
  omlish/dataclasses/specs.py,sha256=r9hpIWy83ODiB1n7wTf7JL5fiCeeT8fWbMvxs7c4e3g,6148
144
144
  omlish/dataclasses/utils.py,sha256=gv6za6oJYBr1VaeGd7oXqq9lhBs_sxkpC27XYzJggno,1870
145
145
  omlish/dataclasses/api/__init__.py,sha256=k5iS9QOwf_f4iOfGffYhnqDOcmEIwEUUTp00u11kIPM,455
146
146
  omlish/dataclasses/api/classes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
147
- omlish/dataclasses/api/classes/conversion.py,sha256=x1Ayo5W3t8lVh10KGH_ZBJ_kK7HqcdI2LdJA6mR_WXQ,810
147
+ omlish/dataclasses/api/classes/conversion.py,sha256=U3g5S-HefJrg4to1BF8XnlEWqMxFeGEqVt8o5OTQK-U,902
148
148
  omlish/dataclasses/api/classes/decorator.py,sha256=q-m05j6VhJ9_00TmrXBvwmv0_TFPTD8OURi1KbKo9-4,3933
149
149
  omlish/dataclasses/api/classes/make.py,sha256=Q_8ZVjhhFEUstIZA3Ht_vlGptYjTcJqX48qT57W7SZw,2820
150
150
  omlish/dataclasses/api/classes/metadata.py,sha256=ocUu75VWOdZA8-R7K95yPhQtS0sFZB1NtqCdzXyDNeQ,2769
@@ -214,7 +214,7 @@ omlish/diag/pycharm.py,sha256=Z2W-Viqw5xq08ZC4z36skpozfYw_qNNhWQx_GYr2D0k,4695
214
214
  omlish/diag/pydevd.py,sha256=UN55ZjkWLCVyHxE2CNRRYamuvSKfzWsn0D5oczRTXO4,7536
215
215
  omlish/diag/threads.py,sha256=1-x02VCDZ407gfbtXm1pWK-ubqhqfePm9PMqkHCVoqk,3642
216
216
  omlish/diag/_pycharm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
217
- omlish/diag/_pycharm/runhack.py,sha256=O37sduvkx99uQaEg_XWLDBJlUxaqgd2LkjmdGaUT6e4,35432
217
+ omlish/diag/_pycharm/runhack.py,sha256=f4R9SOH0nDfO2WqPh0xQ9-45qOLrtTVysS-hSwtbdOA,37864
218
218
  omlish/diag/replserver/__init__.py,sha256=uLo6V2aQ29v9z3IMELlPDSlG3_2iOT4-_X8VniF-EgE,235
219
219
  omlish/diag/replserver/__main__.py,sha256=LmU41lQ58bm1h4Mx7S8zhE_uEBSC6kPcp9mn5JRpulA,32
220
220
  omlish/diag/replserver/console.py,sha256=XzBDVhYlr8FY6ym4OwoaIHuFOHnGK3dTYlMDIOMUUlA,7410
@@ -853,9 +853,9 @@ omlish/typedvalues/holder.py,sha256=ZTnHiw-K38ciOBLEdwgrltr7Xp8jjEs_0Lp69DH-G-o,
853
853
  omlish/typedvalues/marshal.py,sha256=hWHRLcrGav7lvXJDtb9bNI0ickl4SKPQ6F4BbTpqw3A,4219
854
854
  omlish/typedvalues/reflect.py,sha256=Ih1YgU-srUjsvBn_P7C66f73_VCvcwqE3ffeBnZBgt4,674
855
855
  omlish/typedvalues/values.py,sha256=ym46I-q2QJ_6l4UlERqv3yj87R-kp8nCKMRph0xQ3UA,1307
856
- omlish-0.0.0.dev317.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
857
- omlish-0.0.0.dev317.dist-info/METADATA,sha256=4Z0c7koet4xBZgji9URV0S85ozghSxQShBteed3cg4s,4416
858
- omlish-0.0.0.dev317.dist-info/WHEEL,sha256=zaaOINJESkSfm_4HQVc5ssNzHCPXhJm0kEUakpsEHaU,91
859
- omlish-0.0.0.dev317.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
860
- omlish-0.0.0.dev317.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
861
- omlish-0.0.0.dev317.dist-info/RECORD,,
856
+ omlish-0.0.0.dev318.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
857
+ omlish-0.0.0.dev318.dist-info/METADATA,sha256=-Nc1DXmiJNc5JokC60eHTE9VTgT6oMoXEf496J6i6UE,4416
858
+ omlish-0.0.0.dev318.dist-info/WHEEL,sha256=zaaOINJESkSfm_4HQVc5ssNzHCPXhJm0kEUakpsEHaU,91
859
+ omlish-0.0.0.dev318.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
860
+ omlish-0.0.0.dev318.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
861
+ omlish-0.0.0.dev318.dist-info/RECORD,,