ominfra 0.0.0.dev209__py3-none-any.whl → 0.0.0.dev211__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
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(