ominfra 0.0.0.dev209__py3-none-any.whl → 0.0.0.dev211__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.
ominfra/__about__.py CHANGED
@@ -10,7 +10,6 @@ class Project(ProjectBase):
10
10
  dependencies = [
11
11
  f'omdev == {__version__}',
12
12
  f'omlish == {__version__}',
13
- f'omserv == {__version__}',
14
13
  ]
15
14
 
16
15
  optional_dependencies = {
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env python3
2
1
  # @omlish-amalg ../../../scripts/journald2aws.py
3
2
  import argparse
4
3
  import dataclasses as dc
@@ -1,3 +1,4 @@
1
+ import abc
1
2
  import typing as ta
2
3
 
3
4
  from omlish import cached
@@ -16,10 +17,33 @@ Timestamp = ta.NewType('Timestamp', str)
16
17
  ##
17
18
 
18
19
 
19
- class TagList:
20
+ @dc.dataclass(frozen=True)
21
+ class Tag:
22
+ key: str
23
+ value: str
24
+
25
+
26
+ TagList: ta.TypeAlias = ta.Sequence[Tag]
27
+
28
+
29
+ ##
30
+
31
+
32
+ class ValueType(abc.ABC): # noqa
20
33
  pass
21
34
 
22
35
 
36
+ @dc.dataclass(frozen=True)
37
+ class ListValueType(ValueType):
38
+ e: type
39
+
40
+
41
+ @dc.dataclass(frozen=True)
42
+ class MapValueType(ValueType):
43
+ k: type
44
+ v: type
45
+
46
+
23
47
  ##
24
48
 
25
49
 
@@ -71,27 +95,27 @@ class ShapeInfo:
71
95
 
72
96
  #
73
97
 
74
- @cached.function
98
+ @cached.property
75
99
  def fields(self) -> ta.Sequence[dc.Field]:
76
100
  check.state(dc.is_immediate_dataclass(self._cls))
77
101
  fls = dc.fields(self._cls)
78
102
  return fls # noqa
79
103
 
80
- @cached.function
104
+ @cached.property
81
105
  def fields_by_name(self) -> ta.Mapping[str, dc.Field]:
82
- return col.make_map_by(lambda fl: fl.name, self.fields(), strict=True)
106
+ return col.make_map_by(lambda fl: fl.name, self.fields, strict=True)
83
107
 
84
- @cached.function
108
+ @cached.property
85
109
  def fields_by_member_name(self) -> ta.Mapping[str, dc.Field]:
86
110
  return col.make_map(
87
- [(n, f) for f in self.fields() if (n := f.metadata.get(MEMBER_NAME)) is not None],
111
+ [(n, f) for f in self.fields if (n := f.metadata.get(MEMBER_NAME)) is not None],
88
112
  strict=True,
89
113
  )
90
114
 
91
- @cached.function
115
+ @cached.property
92
116
  def fields_by_serialization_name(self) -> ta.Mapping[str, dc.Field]:
93
117
  l = []
94
- for f in self.fields():
118
+ for f in self.fields:
95
119
  if sn := f.metadata.get(SERIALIZATION_NAME):
96
120
  l.append((sn, f))
97
121
  elif mn := f.metadata.get(MEMBER_NAME):
@@ -99,9 +123,9 @@ class ShapeInfo:
99
123
  return col.make_map(l, strict=True)
100
124
 
101
125
 
102
- @dc.dataclass(frozen=True)
126
+ @dc.dataclass(frozen=True, kw_only=True)
103
127
  class Shape:
104
- __shape__: ShapeInfo
128
+ __shape__: ta.ClassVar[ShapeInfo]
105
129
 
106
130
  def __init_subclass__(
107
131
  cls,
@@ -132,10 +156,18 @@ class SERIALIZATION_NAME(lang.Marker): # noqa
132
156
  pass
133
157
 
134
158
 
159
+ class VALUE_TYPE(lang.Marker): # noqa
160
+ pass
161
+
162
+
163
+ #
164
+
165
+
135
166
  def field_metadata(
136
167
  *,
137
168
  member_name: str | None = None,
138
169
  serialization_name: str | None = None,
170
+ value_type: ValueType | None = None,
139
171
  **kwargs: ta.Any,
140
172
  ) -> dict[ta.Any, ta.Any]:
141
173
  md = {**common_metadata(**kwargs)}
@@ -144,6 +176,8 @@ def field_metadata(
144
176
  md[MEMBER_NAME] = member_name
145
177
  if serialization_name is not None:
146
178
  md[SERIALIZATION_NAME] = serialization_name
179
+ if value_type is not None:
180
+ md[VALUE_TYPE] = value_type
147
181
 
148
182
  return md
149
183
 
@@ -164,6 +164,7 @@ class ModelGen:
164
164
  'DateTime': '_base.DateTime',
165
165
  'MillisecondDateTime': '_base.MillisecondDateTime',
166
166
 
167
+ 'Tag': '_base.Tag',
167
168
  'TagList': '_base.TagList',
168
169
  }
169
170
 
@@ -303,6 +304,8 @@ class ModelGen:
303
304
  san_name = self.sanitize_global_name(shape.name, upper=True)
304
305
 
305
306
  if isinstance(shape, botocore.model.StructureShape):
307
+ rms = frozenset(shape.required_members or [])
308
+
306
309
  lines: list[str] = []
307
310
 
308
311
  mds = [
@@ -310,7 +313,7 @@ class ModelGen:
310
313
  ]
311
314
 
312
315
  lines.extend([
313
- '@_dc.dataclass(frozen=True)',
316
+ '@_dc.dataclass(frozen=True, kw_only=True)',
314
317
  f'class {san_name}(',
315
318
  ' _base.Shape,',
316
319
  *[f' {dl},' for dl in mds],
@@ -320,27 +323,64 @@ class ModelGen:
320
323
  if not shape.members:
321
324
  lines.append(' pass')
322
325
 
326
+ ms: botocore.model.Shape
323
327
  for i, (mn, ms) in enumerate(shape.members.items()):
324
- if i:
325
- lines.append('')
326
- fn = self.sanitize_local_name(self.demangle_name(mn))
327
328
  mds = [
328
329
  f'member_name={mn!r}',
329
330
  ]
331
+
330
332
  if msn := ms.serialization.get('name'):
331
333
  mds.append(f'serialization_name={msn!r}')
334
+
335
+ if isinstance(ms, botocore.model.MapShape):
336
+ ka = self.get_type_ann(
337
+ ms.key.name,
338
+ unquoted_names=unquoted_names,
339
+ ) or ms.key.name
340
+ va = self.get_type_ann(
341
+ ms.value.name,
342
+ unquoted_names=unquoted_names,
343
+ ) or ms.value.name
344
+ mds.append(f'value_type=_base.MapValueType({ka}, {va})')
345
+
346
+ elif isinstance(ms, botocore.model.ListShape):
347
+ ea = self.get_type_ann(
348
+ ms.member.name,
349
+ unquoted_names=unquoted_names,
350
+ ) or ms.member.name
351
+ mds.append(f'value_type=_base.ListValueType({ea})')
352
+
332
353
  mds.append(f'shape_name={ms.name!r}')
354
+
333
355
  ma = self.get_type_ann(
334
356
  ms.name,
335
357
  unquoted_names=unquoted_names,
336
358
  )
359
+
360
+ #
361
+
362
+ if i:
363
+ lines.append('')
364
+
365
+ fr = mn in rms
366
+ fa = ma or ms.name
367
+ if fr:
368
+ fd = ''
369
+ else:
370
+ fa += ' | None'
371
+ fd = 'default=None, '
372
+
373
+ fn = self.sanitize_local_name(self.demangle_name(mn))
374
+
337
375
  fls = [
338
- f'{fn}: {ma or ms.name} = _dc.field(metadata=_base.field_metadata(',
376
+ f'{fn}: {fa} = _dc.field({fd}metadata=_base.field_metadata(',
339
377
  *[f' {dl},' for dl in mds],
340
378
  '))',
341
379
  ]
380
+
342
381
  if ma is None:
343
382
  fls = ['# ' + fl for fl in fls]
383
+
344
384
  lines.append('\n'.join(' ' + fl for fl in fls))
345
385
 
346
386
  return self.ShapeSrc(