ominfra 0.0.0.dev214__py3-none-any.whl → 0.0.0.dev215__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.
@@ -2997,6 +2997,7 @@ class aclosing(contextlib.AbstractAsyncContextManager): # noqa
2997
2997
  TODO:
2998
2998
  - pickle stdlib objs? have to pin to 3.8 pickle protocol, will be cross-version
2999
2999
  - literals
3000
+ - Options.sequence_cls = list, mapping_cls = dict, ... - def with_mutable_containers() -> Options
3000
3001
  """
3001
3002
 
3002
3003
 
@@ -3149,21 +3150,55 @@ class IterableObjMarshaler(ObjMarshaler):
3149
3150
  @dc.dataclass(frozen=True)
3150
3151
  class FieldsObjMarshaler(ObjMarshaler):
3151
3152
  ty: type
3152
- fs: ta.Mapping[str, ObjMarshaler]
3153
+
3154
+ @dc.dataclass(frozen=True)
3155
+ class Field:
3156
+ att: str
3157
+ key: str
3158
+ m: ObjMarshaler
3159
+
3160
+ omit_if_none: bool = False
3161
+
3162
+ fs: ta.Sequence[Field]
3163
+
3153
3164
  non_strict: bool = False
3154
3165
 
3166
+ #
3167
+
3168
+ _fs_by_att: ta.ClassVar[ta.Mapping[str, Field]]
3169
+ _fs_by_key: ta.ClassVar[ta.Mapping[str, Field]]
3170
+
3171
+ def __post_init__(self) -> None:
3172
+ fs_by_att: dict = {}
3173
+ fs_by_key: dict = {}
3174
+ for f in self.fs:
3175
+ check.not_in(check.non_empty_str(f.att), fs_by_att)
3176
+ check.not_in(check.non_empty_str(f.key), fs_by_key)
3177
+ fs_by_att[f.att] = f
3178
+ fs_by_key[f.key] = f
3179
+ self.__dict__['_fs_by_att'] = fs_by_att
3180
+ self.__dict__['_fs_by_key'] = fs_by_key
3181
+
3182
+ #
3183
+
3155
3184
  def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3156
- return {
3157
- k: m.marshal(getattr(o, k), ctx)
3158
- for k, m in self.fs.items()
3159
- }
3185
+ d = {}
3186
+ for f in self.fs:
3187
+ mv = f.m.marshal(getattr(o, f.att), ctx)
3188
+ if mv is None and f.omit_if_none:
3189
+ continue
3190
+ d[f.key] = mv
3191
+ return d
3160
3192
 
3161
3193
  def unmarshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
3162
- return self.ty(**{
3163
- k: self.fs[k].unmarshal(v, ctx)
3164
- for k, v in o.items()
3165
- if not (self.non_strict or ctx.options.non_strict_fields) or k in self.fs
3166
- })
3194
+ kw = {}
3195
+ for k, v in o.items():
3196
+ if (f := self._fs_by_key.get(k)) is None:
3197
+ if not (self.non_strict or ctx.options.non_strict_fields):
3198
+ raise KeyError(k)
3199
+ continue
3200
+ kw[f.att] = f.m.unmarshal(v, ctx)
3201
+ return self.ty(**kw)
3167
3202
 
3168
3203
 
3169
3204
  @dc.dataclass(frozen=True)
@@ -3298,6 +3333,22 @@ def register_single_field_type_obj_marshaler(fld, ty=None):
3298
3333
  ##
3299
3334
 
3300
3335
 
3336
+ class ObjMarshalerFieldMetadata:
3337
+ def __new__(cls, *args, **kwargs): # noqa
3338
+ raise TypeError
3339
+
3340
+
3341
+ class OBJ_MARSHALER_FIELD_KEY(ObjMarshalerFieldMetadata): # noqa
3342
+ pass
3343
+
3344
+
3345
+ class OBJ_MARSHALER_OMIT_IF_NONE(ObjMarshalerFieldMetadata): # noqa
3346
+ pass
3347
+
3348
+
3349
+ ##
3350
+
3351
+
3301
3352
  class ObjMarshalerManager:
3302
3353
  def __init__(
3303
3354
  self,
@@ -3357,14 +3408,30 @@ class ObjMarshalerManager:
3357
3408
  if dc.is_dataclass(ty):
3358
3409
  return FieldsObjMarshaler(
3359
3410
  ty,
3360
- {f.name: rec(f.type) for f in dc.fields(ty)},
3411
+ [
3412
+ FieldsObjMarshaler.Field(
3413
+ att=f.name,
3414
+ key=check.non_empty_str(fk),
3415
+ m=rec(f.type),
3416
+ omit_if_none=check.isinstance(f.metadata.get(OBJ_MARSHALER_OMIT_IF_NONE, False), bool),
3417
+ )
3418
+ for f in dc.fields(ty)
3419
+ if (fk := f.metadata.get(OBJ_MARSHALER_FIELD_KEY, f.name)) is not None
3420
+ ],
3361
3421
  non_strict=non_strict_fields,
3362
3422
  )
3363
3423
 
3364
3424
  if issubclass(ty, tuple) and hasattr(ty, '_fields'):
3365
3425
  return FieldsObjMarshaler(
3366
3426
  ty,
3367
- {p.name: rec(p.annotation) for p in inspect.signature(ty).parameters.values()},
3427
+ [
3428
+ FieldsObjMarshaler.Field(
3429
+ att=p.name,
3430
+ key=p.name,
3431
+ m=rec(p.annotation),
3432
+ )
3433
+ for p in inspect.signature(ty).parameters.values()
3434
+ ],
3368
3435
  non_strict=non_strict_fields,
3369
3436
  )
3370
3437
 
ominfra/scripts/manage.py CHANGED
@@ -6435,6 +6435,7 @@ inj = InjectionApi()
6435
6435
  TODO:
6436
6436
  - pickle stdlib objs? have to pin to 3.8 pickle protocol, will be cross-version
6437
6437
  - literals
6438
+ - Options.sequence_cls = list, mapping_cls = dict, ... - def with_mutable_containers() -> Options
6438
6439
  """
6439
6440
 
6440
6441
 
@@ -6587,21 +6588,55 @@ class IterableObjMarshaler(ObjMarshaler):
6587
6588
  @dc.dataclass(frozen=True)
6588
6589
  class FieldsObjMarshaler(ObjMarshaler):
6589
6590
  ty: type
6590
- fs: ta.Mapping[str, ObjMarshaler]
6591
+
6592
+ @dc.dataclass(frozen=True)
6593
+ class Field:
6594
+ att: str
6595
+ key: str
6596
+ m: ObjMarshaler
6597
+
6598
+ omit_if_none: bool = False
6599
+
6600
+ fs: ta.Sequence[Field]
6601
+
6591
6602
  non_strict: bool = False
6592
6603
 
6604
+ #
6605
+
6606
+ _fs_by_att: ta.ClassVar[ta.Mapping[str, Field]]
6607
+ _fs_by_key: ta.ClassVar[ta.Mapping[str, Field]]
6608
+
6609
+ def __post_init__(self) -> None:
6610
+ fs_by_att: dict = {}
6611
+ fs_by_key: dict = {}
6612
+ for f in self.fs:
6613
+ check.not_in(check.non_empty_str(f.att), fs_by_att)
6614
+ check.not_in(check.non_empty_str(f.key), fs_by_key)
6615
+ fs_by_att[f.att] = f
6616
+ fs_by_key[f.key] = f
6617
+ self.__dict__['_fs_by_att'] = fs_by_att
6618
+ self.__dict__['_fs_by_key'] = fs_by_key
6619
+
6620
+ #
6621
+
6593
6622
  def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
6594
- return {
6595
- k: m.marshal(getattr(o, k), ctx)
6596
- for k, m in self.fs.items()
6597
- }
6623
+ d = {}
6624
+ for f in self.fs:
6625
+ mv = f.m.marshal(getattr(o, f.att), ctx)
6626
+ if mv is None and f.omit_if_none:
6627
+ continue
6628
+ d[f.key] = mv
6629
+ return d
6598
6630
 
6599
6631
  def unmarshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
6600
- return self.ty(**{
6601
- k: self.fs[k].unmarshal(v, ctx)
6602
- for k, v in o.items()
6603
- if not (self.non_strict or ctx.options.non_strict_fields) or k in self.fs
6604
- })
6632
+ kw = {}
6633
+ for k, v in o.items():
6634
+ if (f := self._fs_by_key.get(k)) is None:
6635
+ if not (self.non_strict or ctx.options.non_strict_fields):
6636
+ raise KeyError(k)
6637
+ continue
6638
+ kw[f.att] = f.m.unmarshal(v, ctx)
6639
+ return self.ty(**kw)
6605
6640
 
6606
6641
 
6607
6642
  @dc.dataclass(frozen=True)
@@ -6736,6 +6771,22 @@ def register_single_field_type_obj_marshaler(fld, ty=None):
6736
6771
  ##
6737
6772
 
6738
6773
 
6774
+ class ObjMarshalerFieldMetadata:
6775
+ def __new__(cls, *args, **kwargs): # noqa
6776
+ raise TypeError
6777
+
6778
+
6779
+ class OBJ_MARSHALER_FIELD_KEY(ObjMarshalerFieldMetadata): # noqa
6780
+ pass
6781
+
6782
+
6783
+ class OBJ_MARSHALER_OMIT_IF_NONE(ObjMarshalerFieldMetadata): # noqa
6784
+ pass
6785
+
6786
+
6787
+ ##
6788
+
6789
+
6739
6790
  class ObjMarshalerManager:
6740
6791
  def __init__(
6741
6792
  self,
@@ -6795,14 +6846,30 @@ class ObjMarshalerManager:
6795
6846
  if dc.is_dataclass(ty):
6796
6847
  return FieldsObjMarshaler(
6797
6848
  ty,
6798
- {f.name: rec(f.type) for f in dc.fields(ty)},
6849
+ [
6850
+ FieldsObjMarshaler.Field(
6851
+ att=f.name,
6852
+ key=check.non_empty_str(fk),
6853
+ m=rec(f.type),
6854
+ omit_if_none=check.isinstance(f.metadata.get(OBJ_MARSHALER_OMIT_IF_NONE, False), bool),
6855
+ )
6856
+ for f in dc.fields(ty)
6857
+ if (fk := f.metadata.get(OBJ_MARSHALER_FIELD_KEY, f.name)) is not None
6858
+ ],
6799
6859
  non_strict=non_strict_fields,
6800
6860
  )
6801
6861
 
6802
6862
  if issubclass(ty, tuple) and hasattr(ty, '_fields'):
6803
6863
  return FieldsObjMarshaler(
6804
6864
  ty,
6805
- {p.name: rec(p.annotation) for p in inspect.signature(ty).parameters.values()},
6865
+ [
6866
+ FieldsObjMarshaler.Field(
6867
+ att=p.name,
6868
+ key=p.name,
6869
+ m=rec(p.annotation),
6870
+ )
6871
+ for p in inspect.signature(ty).parameters.values()
6872
+ ],
6806
6873
  non_strict=non_strict_fields,
6807
6874
  )
6808
6875
 
@@ -5616,6 +5616,7 @@ inj = InjectionApi()
5616
5616
  TODO:
5617
5617
  - pickle stdlib objs? have to pin to 3.8 pickle protocol, will be cross-version
5618
5618
  - literals
5619
+ - Options.sequence_cls = list, mapping_cls = dict, ... - def with_mutable_containers() -> Options
5619
5620
  """
5620
5621
 
5621
5622
 
@@ -5768,21 +5769,55 @@ class IterableObjMarshaler(ObjMarshaler):
5768
5769
  @dc.dataclass(frozen=True)
5769
5770
  class FieldsObjMarshaler(ObjMarshaler):
5770
5771
  ty: type
5771
- fs: ta.Mapping[str, ObjMarshaler]
5772
+
5773
+ @dc.dataclass(frozen=True)
5774
+ class Field:
5775
+ att: str
5776
+ key: str
5777
+ m: ObjMarshaler
5778
+
5779
+ omit_if_none: bool = False
5780
+
5781
+ fs: ta.Sequence[Field]
5782
+
5772
5783
  non_strict: bool = False
5773
5784
 
5785
+ #
5786
+
5787
+ _fs_by_att: ta.ClassVar[ta.Mapping[str, Field]]
5788
+ _fs_by_key: ta.ClassVar[ta.Mapping[str, Field]]
5789
+
5790
+ def __post_init__(self) -> None:
5791
+ fs_by_att: dict = {}
5792
+ fs_by_key: dict = {}
5793
+ for f in self.fs:
5794
+ check.not_in(check.non_empty_str(f.att), fs_by_att)
5795
+ check.not_in(check.non_empty_str(f.key), fs_by_key)
5796
+ fs_by_att[f.att] = f
5797
+ fs_by_key[f.key] = f
5798
+ self.__dict__['_fs_by_att'] = fs_by_att
5799
+ self.__dict__['_fs_by_key'] = fs_by_key
5800
+
5801
+ #
5802
+
5774
5803
  def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
5775
- return {
5776
- k: m.marshal(getattr(o, k), ctx)
5777
- for k, m in self.fs.items()
5778
- }
5804
+ d = {}
5805
+ for f in self.fs:
5806
+ mv = f.m.marshal(getattr(o, f.att), ctx)
5807
+ if mv is None and f.omit_if_none:
5808
+ continue
5809
+ d[f.key] = mv
5810
+ return d
5779
5811
 
5780
5812
  def unmarshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
5781
- return self.ty(**{
5782
- k: self.fs[k].unmarshal(v, ctx)
5783
- for k, v in o.items()
5784
- if not (self.non_strict or ctx.options.non_strict_fields) or k in self.fs
5785
- })
5813
+ kw = {}
5814
+ for k, v in o.items():
5815
+ if (f := self._fs_by_key.get(k)) is None:
5816
+ if not (self.non_strict or ctx.options.non_strict_fields):
5817
+ raise KeyError(k)
5818
+ continue
5819
+ kw[f.att] = f.m.unmarshal(v, ctx)
5820
+ return self.ty(**kw)
5786
5821
 
5787
5822
 
5788
5823
  @dc.dataclass(frozen=True)
@@ -5917,6 +5952,22 @@ def register_single_field_type_obj_marshaler(fld, ty=None):
5917
5952
  ##
5918
5953
 
5919
5954
 
5955
+ class ObjMarshalerFieldMetadata:
5956
+ def __new__(cls, *args, **kwargs): # noqa
5957
+ raise TypeError
5958
+
5959
+
5960
+ class OBJ_MARSHALER_FIELD_KEY(ObjMarshalerFieldMetadata): # noqa
5961
+ pass
5962
+
5963
+
5964
+ class OBJ_MARSHALER_OMIT_IF_NONE(ObjMarshalerFieldMetadata): # noqa
5965
+ pass
5966
+
5967
+
5968
+ ##
5969
+
5970
+
5920
5971
  class ObjMarshalerManager:
5921
5972
  def __init__(
5922
5973
  self,
@@ -5976,14 +6027,30 @@ class ObjMarshalerManager:
5976
6027
  if dc.is_dataclass(ty):
5977
6028
  return FieldsObjMarshaler(
5978
6029
  ty,
5979
- {f.name: rec(f.type) for f in dc.fields(ty)},
6030
+ [
6031
+ FieldsObjMarshaler.Field(
6032
+ att=f.name,
6033
+ key=check.non_empty_str(fk),
6034
+ m=rec(f.type),
6035
+ omit_if_none=check.isinstance(f.metadata.get(OBJ_MARSHALER_OMIT_IF_NONE, False), bool),
6036
+ )
6037
+ for f in dc.fields(ty)
6038
+ if (fk := f.metadata.get(OBJ_MARSHALER_FIELD_KEY, f.name)) is not None
6039
+ ],
5980
6040
  non_strict=non_strict_fields,
5981
6041
  )
5982
6042
 
5983
6043
  if issubclass(ty, tuple) and hasattr(ty, '_fields'):
5984
6044
  return FieldsObjMarshaler(
5985
6045
  ty,
5986
- {p.name: rec(p.annotation) for p in inspect.signature(ty).parameters.values()},
6046
+ [
6047
+ FieldsObjMarshaler.Field(
6048
+ att=p.name,
6049
+ key=p.name,
6050
+ m=rec(p.annotation),
6051
+ )
6052
+ for p in inspect.signature(ty).parameters.values()
6053
+ ],
5987
6054
  non_strict=non_strict_fields,
5988
6055
  )
5989
6056
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: ominfra
3
- Version: 0.0.0.dev214
3
+ Version: 0.0.0.dev215
4
4
  Summary: ominfra
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -12,8 +12,8 @@ Classifier: Operating System :: OS Independent
12
12
  Classifier: Operating System :: POSIX
13
13
  Requires-Python: >=3.12
14
14
  License-File: LICENSE
15
- Requires-Dist: omdev==0.0.0.dev214
16
- Requires-Dist: omlish==0.0.0.dev214
15
+ Requires-Dist: omdev==0.0.0.dev215
16
+ Requires-Dist: omlish==0.0.0.dev215
17
17
  Provides-Extra: all
18
18
  Requires-Dist: paramiko~=3.5; extra == "all"
19
19
  Requires-Dist: asyncssh~=2.18; extra == "all"
@@ -112,9 +112,9 @@ ominfra/manage/targets/connection.py,sha256=rVI1YJxFClcF-sdttqWyIz9_XjPI01GUdwxY
112
112
  ominfra/manage/targets/inject.py,sha256=P4597xWM-V3I_gCt2O71OLhYQkkXtuJvkYRsIbhhMcE,1561
113
113
  ominfra/manage/targets/targets.py,sha256=7GP6UAZyJFEhpkJN6UQdpr_WN3p7C76v-s445y-WB6U,1885
114
114
  ominfra/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
115
- ominfra/scripts/journald2aws.py,sha256=betpsc8pvnjJkmLSDXcHHpD-noM4VRuAlQJUEjeqDws,168021
116
- ominfra/scripts/manage.py,sha256=cdSsmsz2rBIpF5UCk6ONoSDrVPspJhOpouvTTYbhj44,359398
117
- ominfra/scripts/supervisor.py,sha256=5D24DEIIyYGo_jGD1l-4wQ3qnumYaeaxXSYgWzWmzv0,293618
115
+ ominfra/scripts/journald2aws.py,sha256=L2869lSuOOAY661RHuBDOASyGdKYV_kv7cGzRLkRYNk,169939
116
+ ominfra/scripts/manage.py,sha256=3W98AKjgRnrJhi8kV4cjolN0KszLe-CjbCpK5EvBWAc,361316
117
+ ominfra/scripts/supervisor.py,sha256=7VnX50-CsDc1TXhTUgdmRMar6rPCUPQWMD2skPJoeCY,295536
118
118
  ominfra/supervisor/LICENSE.txt,sha256=ZrHY15PVR98y26Yg6iQfa-SXnUaYTDhrUsPVcEO5OKM,1874
119
119
  ominfra/supervisor/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
120
120
  ominfra/supervisor/__main__.py,sha256=I0yFw-C08OOiZ3BF6lF1Oiv789EQXu-_j6whDhQUTEA,66
@@ -156,9 +156,9 @@ ominfra/tailscale/api.py,sha256=C5-t_b6jZXUWcy5k8bXm7CFnk73pSdrlMOgGDeGVrpw,1370
156
156
  ominfra/tailscale/cli.py,sha256=3FnJbgpLw6gInTfhERd1mDy9ijjMUGxkdYVo43Tnxx4,3555
157
157
  ominfra/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
158
158
  ominfra/tools/listresources.py,sha256=4qVg5txsb10EHhvqXXeM6gJ2jx9LbroEnPydDv1uXs0,6176
159
- ominfra-0.0.0.dev214.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
160
- ominfra-0.0.0.dev214.dist-info/METADATA,sha256=Gun1HB41EH6n2HvSIaZcphaWup4tjtap9amIZv0CHsk,731
161
- ominfra-0.0.0.dev214.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
162
- ominfra-0.0.0.dev214.dist-info/entry_points.txt,sha256=kgecQ2MgGrM9qK744BoKS3tMesaC3yjLnl9pa5CRczg,37
163
- ominfra-0.0.0.dev214.dist-info/top_level.txt,sha256=E-b2OHkk_AOBLXHYZQ2EOFKl-_6uOGd8EjeG-Zy6h_w,8
164
- ominfra-0.0.0.dev214.dist-info/RECORD,,
159
+ ominfra-0.0.0.dev215.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
160
+ ominfra-0.0.0.dev215.dist-info/METADATA,sha256=6zq5SYVgPq5gGLIj8UXizw_sNhzt87DhAp0MmfNtGcY,731
161
+ ominfra-0.0.0.dev215.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
162
+ ominfra-0.0.0.dev215.dist-info/entry_points.txt,sha256=kgecQ2MgGrM9qK744BoKS3tMesaC3yjLnl9pa5CRczg,37
163
+ ominfra-0.0.0.dev215.dist-info/top_level.txt,sha256=E-b2OHkk_AOBLXHYZQ2EOFKl-_6uOGd8EjeG-Zy6h_w,8
164
+ ominfra-0.0.0.dev215.dist-info/RECORD,,