crossplane-function-pythonic 0.6.1__py3-none-any.whl → 0.6.3__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.
- crossplane/pythonic/__about__.py +8 -2
- crossplane/pythonic/__init__.py +21 -13
- crossplane/pythonic/__main__.py +1 -0
- crossplane/pythonic/auto_ready.py +89 -41
- crossplane/pythonic/command.py +43 -39
- crossplane/pythonic/composite.py +93 -67
- crossplane/pythonic/diff.py +880 -0
- crossplane/pythonic/function.py +194 -99
- crossplane/pythonic/grpc.py +85 -62
- crossplane/pythonic/main.py +13 -4
- crossplane/pythonic/packages.py +77 -50
- crossplane/pythonic/proto/v1/run_function_pb2.py +3 -3
- crossplane/pythonic/proto/v1/run_function_pb2_grpc.py +4 -4
- crossplane/pythonic/protobuf.py +281 -214
- crossplane/pythonic/render.py +413 -201
- crossplane/pythonic/version.py +2 -3
- {crossplane_function_pythonic-0.6.1.dist-info → crossplane_function_pythonic-0.6.3.dist-info}/METADATA +23 -25
- crossplane_function_pythonic-0.6.3.dist-info/RECORD +22 -0
- {crossplane_function_pythonic-0.6.1.dist-info → crossplane_function_pythonic-0.6.3.dist-info}/WHEEL +1 -1
- {crossplane_function_pythonic-0.6.1.dist-info → crossplane_function_pythonic-0.6.3.dist-info}/entry_points.txt +1 -0
- crossplane_function_pythonic-0.6.1.dist-info/RECORD +0 -22
- crossplane_function_pythonic-0.6.1.dist-info/licenses/LICENSE +0 -201
crossplane/pythonic/protobuf.py
CHANGED
|
@@ -17,9 +17,10 @@
|
|
|
17
17
|
|
|
18
18
|
import base64
|
|
19
19
|
import datetime
|
|
20
|
-
import google.protobuf.struct_pb2
|
|
21
20
|
import json
|
|
22
21
|
import sys
|
|
22
|
+
|
|
23
|
+
import google.protobuf.struct_pb2
|
|
23
24
|
import yaml
|
|
24
25
|
|
|
25
26
|
_Unknown = object()
|
|
@@ -29,12 +30,15 @@ append = sys.maxsize
|
|
|
29
30
|
def Map(**kwargs):
|
|
30
31
|
return Value(None, None, kwargs)
|
|
31
32
|
|
|
33
|
+
|
|
32
34
|
def List(*args):
|
|
33
35
|
return Value(None, None, args)
|
|
34
36
|
|
|
37
|
+
|
|
35
38
|
def Unknown():
|
|
36
39
|
return Value(None, None)
|
|
37
40
|
|
|
41
|
+
|
|
38
42
|
def Yaml(string, readOnly=None):
|
|
39
43
|
if isinstance(string, (FieldMessage, Value)):
|
|
40
44
|
if not string:
|
|
@@ -42,12 +46,16 @@ def Yaml(string, readOnly=None):
|
|
|
42
46
|
string = str(string)
|
|
43
47
|
return Value(None, None, yaml.safe_load(string), readOnly)
|
|
44
48
|
|
|
49
|
+
|
|
45
50
|
def YamlAll(string, readOnly=None):
|
|
46
51
|
if isinstance(string, (FieldMessage, Value)):
|
|
47
52
|
if not string:
|
|
48
53
|
return string
|
|
49
54
|
string = str(string)
|
|
50
|
-
return Value(
|
|
55
|
+
return Value(
|
|
56
|
+
None, None, [document for document in yaml.safe_load_all(string)], readOnly
|
|
57
|
+
)
|
|
58
|
+
|
|
51
59
|
|
|
52
60
|
def Json(string, readOnly=None):
|
|
53
61
|
if isinstance(string, (FieldMessage, Value)):
|
|
@@ -56,29 +64,31 @@ def Json(string, readOnly=None):
|
|
|
56
64
|
string = str(string)
|
|
57
65
|
return Value(None, None, json.loads(string), readOnly)
|
|
58
66
|
|
|
67
|
+
|
|
59
68
|
def B64Encode(string):
|
|
60
69
|
if isinstance(string, (FieldMessage, Value)):
|
|
61
70
|
if not string:
|
|
62
71
|
return string
|
|
63
72
|
string = str(string)
|
|
64
|
-
return base64.b64encode(string.encode(
|
|
73
|
+
return base64.b64encode(string.encode("utf-8")).decode("utf-8")
|
|
74
|
+
|
|
65
75
|
|
|
66
76
|
def B64Decode(string):
|
|
67
77
|
if isinstance(string, (FieldMessage, Value)):
|
|
68
78
|
if not string:
|
|
69
79
|
return string
|
|
70
80
|
string = str(string)
|
|
71
|
-
return base64.b64decode(string.encode(
|
|
81
|
+
return base64.b64decode(string.encode("utf-8")).decode("utf-8")
|
|
72
82
|
|
|
73
83
|
|
|
74
84
|
class Message:
|
|
75
85
|
def __init__(self, parent, key, descriptor, message=_Unknown, readOnly=False):
|
|
76
|
-
self._set_attribute(
|
|
77
|
-
self._set_attribute(
|
|
78
|
-
self._set_attribute(
|
|
79
|
-
self._set_attribute(
|
|
80
|
-
self._set_attribute(
|
|
81
|
-
self._set_attribute(
|
|
86
|
+
self._set_attribute("_parent", parent)
|
|
87
|
+
self._set_attribute("_key", key)
|
|
88
|
+
self._set_attribute("_descriptor", descriptor)
|
|
89
|
+
self._set_attribute("_message", message)
|
|
90
|
+
self._set_attribute("_readOnly", readOnly)
|
|
91
|
+
self._set_attribute("_cache", {})
|
|
82
92
|
|
|
83
93
|
def _set_attribute(self, key, value):
|
|
84
94
|
self.__dict__[key] = value
|
|
@@ -100,12 +110,21 @@ class Message:
|
|
|
100
110
|
if value is _Unknown and field.has_default_value:
|
|
101
111
|
value = field.default_value
|
|
102
112
|
if field.is_repeated:
|
|
103
|
-
if
|
|
104
|
-
|
|
113
|
+
if (
|
|
114
|
+
field.type == field.TYPE_MESSAGE
|
|
115
|
+
and field.message_type.GetOptions().map_entry
|
|
116
|
+
):
|
|
117
|
+
value = MapMessage(
|
|
118
|
+
self,
|
|
119
|
+
key,
|
|
120
|
+
field.message_type.fields_by_name["value"],
|
|
121
|
+
value,
|
|
122
|
+
self._readOnly,
|
|
123
|
+
)
|
|
105
124
|
else:
|
|
106
125
|
value = RepeatedMessage(self, key, field, value, self._readOnly)
|
|
107
126
|
elif field.type == field.TYPE_MESSAGE:
|
|
108
|
-
if field.message_type.name in (
|
|
127
|
+
if field.message_type.name in ("Struct", "ListValue"):
|
|
109
128
|
value = Value(self, key, value, self._readOnly)
|
|
110
129
|
else:
|
|
111
130
|
value = Message(self, key, field.message_type, value, self._readOnly)
|
|
@@ -129,7 +148,11 @@ class Message:
|
|
|
129
148
|
|
|
130
149
|
def __hash__(self):
|
|
131
150
|
if self._message is not _Unknown:
|
|
132
|
-
return hash(
|
|
151
|
+
return hash(
|
|
152
|
+
tuple(
|
|
153
|
+
hash(item) for item in sorted(iter(self), key=lambda item: item[0])
|
|
154
|
+
)
|
|
155
|
+
)
|
|
133
156
|
return 0
|
|
134
157
|
|
|
135
158
|
def __eq__(self, other):
|
|
@@ -153,7 +176,7 @@ class Message:
|
|
|
153
176
|
def __str__(self):
|
|
154
177
|
return format(self)
|
|
155
178
|
|
|
156
|
-
def __format__(self, spec=
|
|
179
|
+
def __format__(self, spec="yaml"):
|
|
157
180
|
return _formatObject(self, spec)
|
|
158
181
|
|
|
159
182
|
def _fullName(self, key=None):
|
|
@@ -163,28 +186,28 @@ class Message:
|
|
|
163
186
|
else:
|
|
164
187
|
name = str(self._key)
|
|
165
188
|
if key is not None:
|
|
166
|
-
if
|
|
189
|
+
if "." in key:
|
|
167
190
|
name += f"[{key}]"
|
|
168
191
|
else:
|
|
169
192
|
name += f".{key}"
|
|
170
193
|
return name
|
|
171
194
|
if key is not None:
|
|
172
195
|
return str(key)
|
|
173
|
-
return
|
|
196
|
+
return ""
|
|
174
197
|
|
|
175
198
|
def _create_child(self, key):
|
|
176
199
|
if self._readOnly:
|
|
177
200
|
raise ValueError(f"{self._readOnly} is read only")
|
|
178
201
|
key = self._validate_key(key)
|
|
179
202
|
if self._message is _Unknown:
|
|
180
|
-
self.__dict__[
|
|
203
|
+
self.__dict__["_message"] = self._parent._create_child(self._key)
|
|
181
204
|
return getattr(self._message, key)
|
|
182
205
|
|
|
183
206
|
def __call__(self, **kwargs):
|
|
184
207
|
if self._readOnly:
|
|
185
208
|
raise ValueError(f"{self._readOnly} is read only")
|
|
186
209
|
if self._message is _Unknown:
|
|
187
|
-
self.__dict__[
|
|
210
|
+
self.__dict__["_message"] = self._parent._create_child(self._key)
|
|
188
211
|
self._message.Clear()
|
|
189
212
|
self._cache.clear()
|
|
190
213
|
for key, value in kwargs.items():
|
|
@@ -202,7 +225,7 @@ class Message:
|
|
|
202
225
|
raise AttributeError(obj=self, name=key)
|
|
203
226
|
field = self._descriptor.fields_by_name[key]
|
|
204
227
|
if self._message is _Unknown:
|
|
205
|
-
self.__dict__[
|
|
228
|
+
self.__dict__["_message"] = self._parent._create_child(self._key)
|
|
206
229
|
if isinstance(value, Message):
|
|
207
230
|
value = value._message
|
|
208
231
|
elif isinstance(value, (MapMessage, RepeatedMessage)):
|
|
@@ -212,7 +235,7 @@ class Message:
|
|
|
212
235
|
elif isinstance(value, Value):
|
|
213
236
|
value = value._raw
|
|
214
237
|
if field.type == field.TYPE_BYTES and isinstance(value, str):
|
|
215
|
-
value = value.encode(
|
|
238
|
+
value = value.encode("utf-8")
|
|
216
239
|
setattr(self._message, key, value)
|
|
217
240
|
self._cache.pop(key, None)
|
|
218
241
|
|
|
@@ -241,12 +264,12 @@ class Message:
|
|
|
241
264
|
|
|
242
265
|
class MapMessage:
|
|
243
266
|
def __init__(self, parent, key, field, messages=_Unknown, readOnly=False):
|
|
244
|
-
self._set_attribute(
|
|
245
|
-
self._set_attribute(
|
|
246
|
-
self._set_attribute(
|
|
247
|
-
self._set_attribute(
|
|
248
|
-
self._set_attribute(
|
|
249
|
-
self._set_attribute(
|
|
267
|
+
self._set_attribute("_parent", parent)
|
|
268
|
+
self._set_attribute("_key", key)
|
|
269
|
+
self._set_attribute("_field", field)
|
|
270
|
+
self._set_attribute("_messages", messages)
|
|
271
|
+
self._set_attribute("_readOnly", readOnly)
|
|
272
|
+
self._set_attribute("_cache", {})
|
|
250
273
|
|
|
251
274
|
def _set_attribute(self, key, value):
|
|
252
275
|
self.__dict__[key] = value
|
|
@@ -265,10 +288,12 @@ class MapMessage:
|
|
|
265
288
|
if value is None and self._field.has_default_value:
|
|
266
289
|
value = self._field.default_value
|
|
267
290
|
if self._field.type == self._field.TYPE_MESSAGE:
|
|
268
|
-
if self._field.message_type.name in (
|
|
291
|
+
if self._field.message_type.name in ("Struct", "ListValue"):
|
|
269
292
|
value = Value(self, key, value, self._readOnly)
|
|
270
293
|
else:
|
|
271
|
-
value = Message(
|
|
294
|
+
value = Message(
|
|
295
|
+
self, key, self._field.message_type, value, self._readOnly
|
|
296
|
+
)
|
|
272
297
|
else:
|
|
273
298
|
value = FieldMessage(self, key, self._field.type, value)
|
|
274
299
|
self._cache[key] = value
|
|
@@ -290,7 +315,11 @@ class MapMessage:
|
|
|
290
315
|
|
|
291
316
|
def __hash__(self):
|
|
292
317
|
if self._nessages is not None:
|
|
293
|
-
return hash(
|
|
318
|
+
return hash(
|
|
319
|
+
tuple(
|
|
320
|
+
hash(item) for item in sorted(iter(self), key=lambda item: item[0])
|
|
321
|
+
)
|
|
322
|
+
)
|
|
294
323
|
return 0
|
|
295
324
|
|
|
296
325
|
def __eq__(self, other):
|
|
@@ -298,9 +327,12 @@ class MapMessage:
|
|
|
298
327
|
return False
|
|
299
328
|
if self._field.type != other._field.type:
|
|
300
329
|
return False
|
|
301
|
-
if
|
|
302
|
-
|
|
303
|
-
|
|
330
|
+
if (
|
|
331
|
+
self._field.type == self._field.TYPE_MESSAGE
|
|
332
|
+
and self._field.message_type.full_name
|
|
333
|
+
!= other._field.message_type.full_name
|
|
334
|
+
):
|
|
335
|
+
return False
|
|
304
336
|
if self._messages is _Unknown:
|
|
305
337
|
return other._messages is _Unknown
|
|
306
338
|
elif other._messages is _Unknown:
|
|
@@ -317,7 +349,7 @@ class MapMessage:
|
|
|
317
349
|
def __str__(self):
|
|
318
350
|
return format(self)
|
|
319
351
|
|
|
320
|
-
def __format__(self, spec=
|
|
352
|
+
def __format__(self, spec="yaml"):
|
|
321
353
|
return _formatObject(self, spec)
|
|
322
354
|
|
|
323
355
|
def _fullName(self, key=None):
|
|
@@ -327,28 +359,28 @@ class MapMessage:
|
|
|
327
359
|
else:
|
|
328
360
|
name = str(self._key)
|
|
329
361
|
if key is not None:
|
|
330
|
-
if
|
|
362
|
+
if "." in key:
|
|
331
363
|
name += f"[{key}]"
|
|
332
364
|
else:
|
|
333
365
|
name += f".{key}"
|
|
334
366
|
return name
|
|
335
367
|
if key is not None:
|
|
336
368
|
return str(key)
|
|
337
|
-
return
|
|
369
|
+
return ""
|
|
338
370
|
|
|
339
371
|
def _create_child(self, key):
|
|
340
372
|
if self._readOnly:
|
|
341
373
|
raise ValueError(f"{self._readOnly} is read only")
|
|
342
374
|
key = self._validate_key(key)
|
|
343
375
|
if self._messages is _Unknown:
|
|
344
|
-
self.__dict__[
|
|
376
|
+
self.__dict__["_messages"] = self._parent._create_child(self._key)
|
|
345
377
|
return self._messages[key]
|
|
346
378
|
|
|
347
379
|
def __call__(self, **kwargs):
|
|
348
380
|
if self._readOnly:
|
|
349
381
|
raise ValueError(f"{self._readOnly} is read only")
|
|
350
382
|
if self._messages is _Unknown:
|
|
351
|
-
self.__dict__[
|
|
383
|
+
self.__dict__["_messages"] = self._parent._create_child(self._key)
|
|
352
384
|
self._messages.clear()
|
|
353
385
|
self._cache.clear()
|
|
354
386
|
for key, value in kwargs.items():
|
|
@@ -376,7 +408,7 @@ class MapMessage:
|
|
|
376
408
|
self._messages.pop(key, None)
|
|
377
409
|
else:
|
|
378
410
|
if self._field.type == self._field.TYPE_BYTES and isinstance(message, str):
|
|
379
|
-
message = message.encode(
|
|
411
|
+
message = message.encode("utf-8")
|
|
380
412
|
self._messages[key] = message
|
|
381
413
|
self._cache.pop(key, None)
|
|
382
414
|
|
|
@@ -425,8 +457,7 @@ class RepeatedMessage:
|
|
|
425
457
|
key = 0
|
|
426
458
|
else:
|
|
427
459
|
key = len(self._messages) + key
|
|
428
|
-
|
|
429
|
-
key = 0
|
|
460
|
+
key = max(key, 0)
|
|
430
461
|
if key in self._cache:
|
|
431
462
|
return self._cache[key]
|
|
432
463
|
if self._messages is _Unknown or key >= len(self._messages):
|
|
@@ -436,10 +467,12 @@ class RepeatedMessage:
|
|
|
436
467
|
if value is None and self._field.has_default_value:
|
|
437
468
|
value = self._field.default_value
|
|
438
469
|
if self._field.type == self._field.TYPE_MESSAGE:
|
|
439
|
-
if self._field.message_type.name in (
|
|
470
|
+
if self._field.message_type.name in ("Struct", "ListValue"):
|
|
440
471
|
value = Value(self, key, value, self._readOnly)
|
|
441
472
|
else:
|
|
442
|
-
value = Message(
|
|
473
|
+
value = Message(
|
|
474
|
+
self, key, self._field.message_type, value, self._readOnly
|
|
475
|
+
)
|
|
443
476
|
else:
|
|
444
477
|
value = FieldMessage(self, key, self._field.type, value)
|
|
445
478
|
self._cache[key] = value
|
|
@@ -473,9 +506,12 @@ class RepeatedMessage:
|
|
|
473
506
|
return False
|
|
474
507
|
if self._field.type != other._field.type:
|
|
475
508
|
return False
|
|
476
|
-
if
|
|
477
|
-
|
|
478
|
-
|
|
509
|
+
if (
|
|
510
|
+
self._field.type == self._field.TYPE_MESSAGE
|
|
511
|
+
and self._field.message_type.full_name
|
|
512
|
+
!= other._field.message_type.full_name
|
|
513
|
+
):
|
|
514
|
+
return False
|
|
479
515
|
if self._messages is _Unknown:
|
|
480
516
|
return other._messages is _Unknown
|
|
481
517
|
elif other._messages is _Unknown:
|
|
@@ -490,7 +526,7 @@ class RepeatedMessage:
|
|
|
490
526
|
def __str__(self):
|
|
491
527
|
return format(self)
|
|
492
528
|
|
|
493
|
-
def __format__(self, spec=
|
|
529
|
+
def __format__(self, spec="yaml"):
|
|
494
530
|
return _formatObject(self, spec)
|
|
495
531
|
|
|
496
532
|
def _fullName(self, key=None):
|
|
@@ -504,14 +540,14 @@ class RepeatedMessage:
|
|
|
504
540
|
return name
|
|
505
541
|
if key is not None:
|
|
506
542
|
return str(key)
|
|
507
|
-
return
|
|
543
|
+
return ""
|
|
508
544
|
|
|
509
545
|
def _create_child(self, key):
|
|
510
546
|
if self._readOnly:
|
|
511
547
|
raise ValueError(f"{self._readOnly} is read only")
|
|
512
548
|
key = self._validate_key(key)
|
|
513
549
|
if self._messages is _Unknown:
|
|
514
|
-
self.__dict__[
|
|
550
|
+
self.__dict__["_messages"] = self._parent._create_child(self._key)
|
|
515
551
|
if key == append:
|
|
516
552
|
key = len(self._messages)
|
|
517
553
|
elif key < 0:
|
|
@@ -524,7 +560,7 @@ class RepeatedMessage:
|
|
|
524
560
|
if self._readOnly:
|
|
525
561
|
raise ValueError(f"{self._readOnly} is read only")
|
|
526
562
|
if self._messages is _Unknown:
|
|
527
|
-
self.__dict__[
|
|
563
|
+
self.__dict__["_messages"] = self._parent._create_child(self._key)
|
|
528
564
|
self._messages.clear()
|
|
529
565
|
self._cache.clear()
|
|
530
566
|
for arg in args:
|
|
@@ -553,7 +589,7 @@ class RepeatedMessage:
|
|
|
553
589
|
self._cache.clear()
|
|
554
590
|
else:
|
|
555
591
|
if self._field.type == self._field.TYPE_BYTES and isinstance(message, str):
|
|
556
|
-
message = message.encode(
|
|
592
|
+
message = message.encode("utf-8")
|
|
557
593
|
if key >= len(self._messages):
|
|
558
594
|
self._messages.append(message)
|
|
559
595
|
else:
|
|
@@ -623,19 +659,19 @@ class FieldMessage:
|
|
|
623
659
|
|
|
624
660
|
def __bytes__(self):
|
|
625
661
|
if self._value is _Unknown:
|
|
626
|
-
return None
|
|
662
|
+
return None # noqa: PLE0308
|
|
627
663
|
if isinstance(self._value, str):
|
|
628
|
-
return self._value.encode(
|
|
664
|
+
return self._value.encode("utf-8")
|
|
629
665
|
return bytes(self._value)
|
|
630
666
|
|
|
631
667
|
def __str__(self):
|
|
632
668
|
if self._value is _Unknown:
|
|
633
|
-
return None
|
|
669
|
+
return None # noqa: PLE0307
|
|
634
670
|
if isinstance(self._value, bytes):
|
|
635
|
-
return self._value.decode(
|
|
671
|
+
return self._value.decode("utf-8")
|
|
636
672
|
return str(self._value)
|
|
637
673
|
|
|
638
|
-
def __format__(self, spec=
|
|
674
|
+
def __format__(self, spec=""):
|
|
639
675
|
if self._value is _Unknown:
|
|
640
676
|
return None
|
|
641
677
|
return format(self._value, spec)
|
|
@@ -657,14 +693,14 @@ class FieldMessage:
|
|
|
657
693
|
else:
|
|
658
694
|
name = str(self._key)
|
|
659
695
|
if key is not None:
|
|
660
|
-
if
|
|
696
|
+
if "." in key:
|
|
661
697
|
name += f"[{key}]"
|
|
662
698
|
else:
|
|
663
699
|
name += f".{key}"
|
|
664
700
|
return name
|
|
665
701
|
if key is not None:
|
|
666
702
|
return str(key)
|
|
667
|
-
return
|
|
703
|
+
return ""
|
|
668
704
|
|
|
669
705
|
|
|
670
706
|
class ProtobufValue:
|
|
@@ -675,16 +711,26 @@ class ProtobufValue:
|
|
|
675
711
|
|
|
676
712
|
class Value:
|
|
677
713
|
def __init__(self, parent, key, value=_Unknown, readOnly=None):
|
|
678
|
-
self._set_attribute(
|
|
679
|
-
self._set_attribute(
|
|
680
|
-
self._set_attribute(
|
|
681
|
-
self._set_attribute(
|
|
682
|
-
self._set_attribute(
|
|
683
|
-
self._set_attribute(
|
|
684
|
-
if
|
|
685
|
-
|
|
714
|
+
self._set_attribute("_parent", parent)
|
|
715
|
+
self._set_attribute("_key", key)
|
|
716
|
+
self._set_attribute("_dependencies", {})
|
|
717
|
+
self._set_attribute("_unknowns", {})
|
|
718
|
+
self._set_attribute("_cache", {})
|
|
719
|
+
self._set_attribute("_readOnly", None)
|
|
720
|
+
if (
|
|
721
|
+
isinstance(
|
|
722
|
+
value,
|
|
723
|
+
(
|
|
724
|
+
google.protobuf.struct_pb2.Value,
|
|
725
|
+
google.protobuf.struct_pb2.Struct,
|
|
726
|
+
google.protobuf.struct_pb2.ListValue,
|
|
727
|
+
),
|
|
728
|
+
)
|
|
729
|
+
or value is _Unknown
|
|
730
|
+
):
|
|
731
|
+
self._set_attribute("_value", value)
|
|
686
732
|
else:
|
|
687
|
-
self._set_attribute(
|
|
733
|
+
self._set_attribute("_value", google.protobuf.struct_pb2.Value())
|
|
688
734
|
if value is None:
|
|
689
735
|
self._value.null_value = 0
|
|
690
736
|
elif isinstance(value, dict):
|
|
@@ -695,7 +741,7 @@ class Value:
|
|
|
695
741
|
self._value.list_value.Clear()
|
|
696
742
|
for ix, v in enumerate(value):
|
|
697
743
|
self[ix] = v
|
|
698
|
-
elif isinstance(value, bool):
|
|
744
|
+
elif isinstance(value, bool): # Must be before number check
|
|
699
745
|
self._value.bool_value = value
|
|
700
746
|
elif isinstance(value, (int, float)):
|
|
701
747
|
self._value.number_value = value
|
|
@@ -703,7 +749,7 @@ class Value:
|
|
|
703
749
|
self._value.string_value = value
|
|
704
750
|
else:
|
|
705
751
|
raise ValueError(f"Unexpected Value type: {value.__class__}")
|
|
706
|
-
self._set_attribute(
|
|
752
|
+
self._set_attribute("_readOnly", readOnly)
|
|
707
753
|
|
|
708
754
|
def _set_attribute(self, key, value):
|
|
709
755
|
self.__dict__[key] = value
|
|
@@ -732,42 +778,40 @@ class Value:
|
|
|
732
778
|
return self._unknowns[key]
|
|
733
779
|
if isinstance(key, str):
|
|
734
780
|
match self._kind:
|
|
735
|
-
case
|
|
781
|
+
case "struct_value":
|
|
736
782
|
value = self._value.struct_value.fields.get(key, _Unknown)
|
|
737
|
-
case
|
|
783
|
+
case "Struct":
|
|
738
784
|
value = self._value.fields.get(key, _Unknown)
|
|
739
|
-
case
|
|
785
|
+
case "Unknown":
|
|
740
786
|
value = _Unknown
|
|
741
787
|
case _:
|
|
742
|
-
raise ValueError(f
|
|
788
|
+
raise ValueError(f'Invalid key "{key}" for kind: {self._kind}')
|
|
743
789
|
elif isinstance(key, int):
|
|
744
790
|
match self._kind:
|
|
745
|
-
case
|
|
791
|
+
case "list_value":
|
|
746
792
|
if key < 0:
|
|
747
793
|
key = len(self._value.list_value.values) + key
|
|
748
|
-
|
|
749
|
-
key = 0
|
|
794
|
+
key = max(key, 0)
|
|
750
795
|
if key < len(self._value.list_value.values):
|
|
751
796
|
value = self._value.list_value.values[key]
|
|
752
797
|
else:
|
|
753
798
|
if key == append:
|
|
754
799
|
key = len(self._value.list_value.values)
|
|
755
800
|
value = _Unknown
|
|
756
|
-
case
|
|
801
|
+
case "ListValue":
|
|
757
802
|
if key < 0:
|
|
758
803
|
key = len(self._value.values) + key
|
|
759
|
-
|
|
760
|
-
key = 0
|
|
804
|
+
key = max(key, 0)
|
|
761
805
|
if key < len(self._value.values):
|
|
762
806
|
value = self._value.values[key]
|
|
763
807
|
else:
|
|
764
808
|
if key == append:
|
|
765
809
|
key = len(self._value.values)
|
|
766
810
|
value = _Unknown
|
|
767
|
-
case
|
|
811
|
+
case "Unknown":
|
|
768
812
|
value = _Unknown
|
|
769
813
|
case _:
|
|
770
|
-
raise ValueError(f
|
|
814
|
+
raise ValueError(f'Invalid key "{key}" for kind: {self._kind}')
|
|
771
815
|
else:
|
|
772
816
|
raise NotImplementedError()
|
|
773
817
|
value = Value(self, key, value, self._readOnly)
|
|
@@ -779,29 +823,29 @@ class Value:
|
|
|
779
823
|
|
|
780
824
|
def __len__(self):
|
|
781
825
|
match self._kind:
|
|
782
|
-
case
|
|
826
|
+
case "struct_value":
|
|
783
827
|
return len(self._value.struct_value.fields) + len(self._unknowns)
|
|
784
|
-
case
|
|
828
|
+
case "Struct":
|
|
785
829
|
return len(self._value.fields) + len(self._unknowns)
|
|
786
|
-
case
|
|
830
|
+
case "list_value":
|
|
787
831
|
return len(self._value.list_value.values) + len(self._unknowns)
|
|
788
|
-
case
|
|
832
|
+
case "ListValue":
|
|
789
833
|
return len(self._value.values) + len(self._unknowns)
|
|
790
|
-
case
|
|
834
|
+
case "string_value":
|
|
791
835
|
return len(self._value.string_value)
|
|
792
|
-
case
|
|
836
|
+
case "bool_value":
|
|
793
837
|
return 1 if self._value.bool_value else 0
|
|
794
838
|
return 0
|
|
795
839
|
|
|
796
840
|
def __contains__(self, item):
|
|
797
841
|
match self._kind:
|
|
798
|
-
case
|
|
842
|
+
case "struct_value":
|
|
799
843
|
item = self._validate_key(item)
|
|
800
844
|
return item in self._value.struct_value.fields or item in self._unknowns
|
|
801
|
-
case
|
|
845
|
+
case "Struct":
|
|
802
846
|
item = self._validate_key(item)
|
|
803
847
|
return item in self._value.fields or item in self._unknowns
|
|
804
|
-
case
|
|
848
|
+
case "list_value" | "ListValue":
|
|
805
849
|
for value in self:
|
|
806
850
|
if item == value:
|
|
807
851
|
return True
|
|
@@ -809,19 +853,21 @@ class Value:
|
|
|
809
853
|
|
|
810
854
|
def __iter__(self):
|
|
811
855
|
match self._kind:
|
|
812
|
-
case
|
|
813
|
-
for key in sorted(
|
|
856
|
+
case "struct_value":
|
|
857
|
+
for key in sorted(
|
|
858
|
+
set(self._value.struct_value.fields) | set(self._unknowns.keys())
|
|
859
|
+
):
|
|
814
860
|
yield key, self[key]
|
|
815
|
-
case
|
|
861
|
+
case "Struct":
|
|
816
862
|
for key in sorted(set(self._value.fields) | set(self._unknowns.keys())):
|
|
817
863
|
yield key, self[key]
|
|
818
|
-
case
|
|
864
|
+
case "list_value":
|
|
819
865
|
for ix in range(len(self._value.list_value.values)):
|
|
820
866
|
yield self[ix]
|
|
821
867
|
for ix in sorted(self._unknowns.keys()):
|
|
822
868
|
if ix >= len(self._value.list_value.values):
|
|
823
869
|
yield self[ix]
|
|
824
|
-
case
|
|
870
|
+
case "ListValue":
|
|
825
871
|
for ix in range(len(self._value.values)):
|
|
826
872
|
yield self[ix]
|
|
827
873
|
for ix in sorted(self._unknowns.keys()):
|
|
@@ -830,17 +876,22 @@ class Value:
|
|
|
830
876
|
|
|
831
877
|
def __hash__(self):
|
|
832
878
|
match self._kind:
|
|
833
|
-
case
|
|
834
|
-
return hash(
|
|
835
|
-
|
|
879
|
+
case "struct_value" | "Struct":
|
|
880
|
+
return hash(
|
|
881
|
+
tuple(
|
|
882
|
+
hash(item)
|
|
883
|
+
for item in sorted(iter(self), key=lambda item: item[0])
|
|
884
|
+
)
|
|
885
|
+
)
|
|
886
|
+
case "list_value" | "ListValue":
|
|
836
887
|
return hash(tuple(hash(item) for item in self))
|
|
837
|
-
case
|
|
888
|
+
case "string_value":
|
|
838
889
|
return hash(self._value.string_value)
|
|
839
|
-
case
|
|
890
|
+
case "null_value":
|
|
840
891
|
return hash(None)
|
|
841
|
-
case
|
|
892
|
+
case "number_value":
|
|
842
893
|
return hash(self._value.number_value)
|
|
843
|
-
case
|
|
894
|
+
case "bool_value":
|
|
844
895
|
return hash(self._value.bool_value)
|
|
845
896
|
return 0
|
|
846
897
|
|
|
@@ -849,7 +900,7 @@ class Value:
|
|
|
849
900
|
if isinstance(other, Value) and other._kind != kind:
|
|
850
901
|
return False
|
|
851
902
|
match kind:
|
|
852
|
-
case
|
|
903
|
+
case "struct_value" | "Struct":
|
|
853
904
|
if not isinstance(other, (Value, dict)):
|
|
854
905
|
return False
|
|
855
906
|
if len(self) != len(other):
|
|
@@ -860,7 +911,7 @@ class Value:
|
|
|
860
911
|
if value != other[key]:
|
|
861
912
|
return False
|
|
862
913
|
return True
|
|
863
|
-
case
|
|
914
|
+
case "list_value" | "ListValue":
|
|
864
915
|
if not isinstance(other, (Value, tuple, list)):
|
|
865
916
|
return False
|
|
866
917
|
if len(self) != len(other):
|
|
@@ -869,27 +920,27 @@ class Value:
|
|
|
869
920
|
if value != other[ix]:
|
|
870
921
|
return False
|
|
871
922
|
return True
|
|
872
|
-
case
|
|
923
|
+
case "Unknown":
|
|
873
924
|
if isinstance(other, Value):
|
|
874
925
|
return other._isUnknown
|
|
875
926
|
return False
|
|
876
|
-
case
|
|
927
|
+
case "string_value":
|
|
877
928
|
if isinstance(other, Value):
|
|
878
929
|
return self._value.string_value == other._value.string_value
|
|
879
930
|
if isinstance(other, str):
|
|
880
931
|
return self._value.string_value == other
|
|
881
932
|
return False
|
|
882
|
-
case
|
|
933
|
+
case "null_value":
|
|
883
934
|
if isinstance(other, Value):
|
|
884
935
|
return True
|
|
885
936
|
return other is None
|
|
886
|
-
case
|
|
937
|
+
case "number_value":
|
|
887
938
|
if isinstance(other, Value):
|
|
888
939
|
return self._value.number_value == other._value.number_value
|
|
889
940
|
if isinstance(other, (int, float)):
|
|
890
941
|
return self._value.number_value == other
|
|
891
942
|
return False
|
|
892
|
-
case
|
|
943
|
+
case "bool_value":
|
|
893
944
|
if isinstance(other, Value):
|
|
894
945
|
return self._value.bool_value == other._value.bool_value
|
|
895
946
|
if isinstance(other, bool):
|
|
@@ -899,7 +950,7 @@ class Value:
|
|
|
899
950
|
|
|
900
951
|
def __or__(self, other):
|
|
901
952
|
kind = self._kind
|
|
902
|
-
if kind not in (
|
|
953
|
+
if kind not in ("struct_value", "Struct"):
|
|
903
954
|
return NotImplemented
|
|
904
955
|
if not isinstance(other, (Value, dict)):
|
|
905
956
|
return NotImplemented
|
|
@@ -917,56 +968,56 @@ class Value:
|
|
|
917
968
|
result = Map()
|
|
918
969
|
for key, value in other.items():
|
|
919
970
|
result[key] = value
|
|
920
|
-
if self._kind not in (
|
|
971
|
+
if self._kind not in ("struct_value", "Struct"):
|
|
921
972
|
return NotImplemented
|
|
922
973
|
for key, value in self:
|
|
923
974
|
result[key] = value
|
|
924
975
|
return result
|
|
925
976
|
|
|
926
977
|
def __str__(self):
|
|
927
|
-
return format(self,
|
|
978
|
+
return format(self, "")
|
|
928
979
|
|
|
929
|
-
def __format__(self, spec=
|
|
980
|
+
def __format__(self, spec="yaml"):
|
|
930
981
|
if not spec:
|
|
931
982
|
match self._kind:
|
|
932
|
-
case
|
|
933
|
-
return
|
|
934
|
-
case
|
|
983
|
+
case "Unknown":
|
|
984
|
+
return "<<UNKNOWN>>"
|
|
985
|
+
case "string_value":
|
|
935
986
|
return self._value.string_value
|
|
936
|
-
case
|
|
937
|
-
return
|
|
938
|
-
case
|
|
987
|
+
case "null_value":
|
|
988
|
+
return "null"
|
|
989
|
+
case "number_value":
|
|
939
990
|
value = self._value.number_value
|
|
940
991
|
if value.is_integer():
|
|
941
992
|
value = int(value)
|
|
942
993
|
return str(value)
|
|
943
|
-
case
|
|
944
|
-
return
|
|
994
|
+
case "bool_value":
|
|
995
|
+
return "true" if self._value.bool_value else "false"
|
|
945
996
|
return _formatObject(self, spec)
|
|
946
997
|
|
|
947
998
|
def __int__(self):
|
|
948
999
|
kind = self._kind
|
|
949
1000
|
match kind:
|
|
950
|
-
case
|
|
1001
|
+
case "string_value":
|
|
951
1002
|
return int(self._value.string_value)
|
|
952
|
-
case
|
|
1003
|
+
case "number_value":
|
|
953
1004
|
return int(self._value.number_value)
|
|
954
|
-
case
|
|
1005
|
+
case "bool_value":
|
|
955
1006
|
return int(self._value.bool_value)
|
|
956
|
-
case
|
|
1007
|
+
case "Unknown":
|
|
957
1008
|
return 0
|
|
958
1009
|
raise TypeError(f"Cannot convert kind to integer: {kind}")
|
|
959
1010
|
|
|
960
1011
|
def __float__(self):
|
|
961
1012
|
kind = self._kind
|
|
962
1013
|
match kind:
|
|
963
|
-
case
|
|
1014
|
+
case "string_value":
|
|
964
1015
|
return float(self._value.string_value)
|
|
965
|
-
case
|
|
1016
|
+
case "number_value":
|
|
966
1017
|
return float(self._value.number_value)
|
|
967
|
-
case
|
|
1018
|
+
case "bool_value":
|
|
968
1019
|
return float(self._value.bool_value)
|
|
969
|
-
case
|
|
1020
|
+
case "Unknown":
|
|
970
1021
|
return 0.0
|
|
971
1022
|
raise TypeError(f"Cannot convert kind to float: {kind}")
|
|
972
1023
|
|
|
@@ -988,25 +1039,25 @@ class Value:
|
|
|
988
1039
|
if isinstance(key, int):
|
|
989
1040
|
name += f"[{key}]"
|
|
990
1041
|
else:
|
|
991
|
-
if
|
|
1042
|
+
if "." in key:
|
|
992
1043
|
name += f"[{key}]"
|
|
993
1044
|
else:
|
|
994
1045
|
name += f".{key}"
|
|
995
1046
|
return name
|
|
996
1047
|
if key is not None:
|
|
997
1048
|
return str(key)
|
|
998
|
-
return
|
|
1049
|
+
return ""
|
|
999
1050
|
|
|
1000
1051
|
def __call__(self, *args, **kwargs):
|
|
1001
1052
|
if self._readOnly:
|
|
1002
1053
|
raise ValueError(f"{self._readOnly} is read only")
|
|
1003
|
-
self.__dict__[
|
|
1054
|
+
self.__dict__["_value"] = google.protobuf.struct_pb2.Value()
|
|
1004
1055
|
self._cache.clear()
|
|
1005
1056
|
self._dependencies.clear()
|
|
1006
1057
|
self._unknowns.clear()
|
|
1007
1058
|
if len(kwargs):
|
|
1008
1059
|
if len(args):
|
|
1009
|
-
raise ValueError(
|
|
1060
|
+
raise ValueError("Connect specify both kwargs and args")
|
|
1010
1061
|
for key, value in kwargs.items():
|
|
1011
1062
|
self[key] = value
|
|
1012
1063
|
elif len(args):
|
|
@@ -1024,12 +1075,12 @@ class Value:
|
|
|
1024
1075
|
raise ValueError(f"{self._readOnly} is read only")
|
|
1025
1076
|
key = self._validate_key(key)
|
|
1026
1077
|
if isinstance(key, str):
|
|
1027
|
-
if self._ensure_map() ==
|
|
1078
|
+
if self._ensure_map() == "struct_value":
|
|
1028
1079
|
values = self._value.struct_value.fields
|
|
1029
1080
|
else:
|
|
1030
1081
|
values = self._value.fields
|
|
1031
1082
|
elif isinstance(key, int):
|
|
1032
|
-
if self._ensure_list() ==
|
|
1083
|
+
if self._ensure_list() == "list_value":
|
|
1033
1084
|
values = self._value.list_value.values
|
|
1034
1085
|
else:
|
|
1035
1086
|
values = self._value.values
|
|
@@ -1048,10 +1099,10 @@ class Value:
|
|
|
1048
1099
|
value = value._protobuf_value
|
|
1049
1100
|
if value is None:
|
|
1050
1101
|
values[key].null_value = 0
|
|
1051
|
-
elif isinstance(value, bool):
|
|
1102
|
+
elif isinstance(value, bool): # Must be before int check
|
|
1052
1103
|
values[key].bool_value = value
|
|
1053
1104
|
elif isinstance(value, bytes):
|
|
1054
|
-
values[key].string_value = value._value.decode(
|
|
1105
|
+
values[key].string_value = value._value.decode("utf-8")
|
|
1055
1106
|
elif isinstance(value, str):
|
|
1056
1107
|
values[key].string_value = value
|
|
1057
1108
|
elif isinstance(value, (int, float)):
|
|
@@ -1069,7 +1120,7 @@ class Value:
|
|
|
1069
1120
|
if isinstance(value._value, str):
|
|
1070
1121
|
values[key].string_value = value._value
|
|
1071
1122
|
elif isinstance(value._value, bytes):
|
|
1072
|
-
values[key].string_value = value._value.decode(
|
|
1123
|
+
values[key].string_value = value._value.decode("utf-8")
|
|
1073
1124
|
elif value._value is None:
|
|
1074
1125
|
values[key].null_value = value._value.null_value
|
|
1075
1126
|
elif isinstance(value._value, (int, float)):
|
|
@@ -1083,23 +1134,23 @@ class Value:
|
|
|
1083
1134
|
elif isinstance(value, Value):
|
|
1084
1135
|
self._dependencies[key] = value
|
|
1085
1136
|
match value._kind:
|
|
1086
|
-
case
|
|
1137
|
+
case "struct_value" | "Struct":
|
|
1087
1138
|
values[key].struct_value.Clear()
|
|
1088
1139
|
for k, v in value:
|
|
1089
1140
|
self[key][k] = v
|
|
1090
|
-
case
|
|
1141
|
+
case "list_value" | "ListValue":
|
|
1091
1142
|
values[key].list_value.Clear()
|
|
1092
1143
|
for ix, v in enumerate(value):
|
|
1093
1144
|
self[key][ix] = v
|
|
1094
|
-
case
|
|
1145
|
+
case "string_value":
|
|
1095
1146
|
values[key].string_value = value._value.string_value
|
|
1096
|
-
case
|
|
1147
|
+
case "null_value":
|
|
1097
1148
|
values[key].null_value = value._value.null_value
|
|
1098
|
-
case
|
|
1149
|
+
case "number_value":
|
|
1099
1150
|
values[key].number_value = value._value.number_value
|
|
1100
|
-
case
|
|
1151
|
+
case "bool_value":
|
|
1101
1152
|
values[key].bool_value = value._value.bool_value
|
|
1102
|
-
case
|
|
1153
|
+
case "Unknown":
|
|
1103
1154
|
self._setUnknown(key, value)
|
|
1104
1155
|
case _:
|
|
1105
1156
|
raise ValueError(f"Unexpected value kind: {value._kind}")
|
|
@@ -1109,41 +1160,41 @@ class Value:
|
|
|
1109
1160
|
@property
|
|
1110
1161
|
def _raw(self):
|
|
1111
1162
|
match self._kind:
|
|
1112
|
-
case
|
|
1163
|
+
case "struct_value":
|
|
1113
1164
|
return self._value.struct_value
|
|
1114
|
-
case
|
|
1165
|
+
case "list_value":
|
|
1115
1166
|
return self._value.list_value
|
|
1116
|
-
case
|
|
1167
|
+
case "string_value":
|
|
1117
1168
|
return self._value.string_value
|
|
1118
|
-
case
|
|
1169
|
+
case "null_value":
|
|
1119
1170
|
return self._value.null_value
|
|
1120
|
-
case
|
|
1171
|
+
case "number_value":
|
|
1121
1172
|
return self._value.number_value
|
|
1122
|
-
case
|
|
1173
|
+
case "bool_value":
|
|
1123
1174
|
return self._value.bool_value
|
|
1124
|
-
case
|
|
1175
|
+
case "Struct" | "ListValue":
|
|
1125
1176
|
return self._value
|
|
1126
|
-
case
|
|
1177
|
+
case "Unknown":
|
|
1127
1178
|
return _Unknown
|
|
1128
1179
|
|
|
1129
1180
|
def _setUnknown(self, key, value):
|
|
1130
1181
|
self._dependencies.pop(key, None)
|
|
1131
1182
|
self._unknowns[key] = value
|
|
1132
1183
|
match self._kind:
|
|
1133
|
-
case
|
|
1184
|
+
case "struct_value":
|
|
1134
1185
|
if key in self._value.struct_value.fields:
|
|
1135
1186
|
del self._value.struct_value[key]
|
|
1136
|
-
case
|
|
1187
|
+
case "Struct":
|
|
1137
1188
|
if key in self._value.fields:
|
|
1138
1189
|
del self._value[key]
|
|
1139
|
-
case
|
|
1190
|
+
case "list_value":
|
|
1140
1191
|
if key < len(self._value.list_value.values):
|
|
1141
1192
|
self._value.list_value.values[key].Clear()
|
|
1142
1193
|
for ix in reversed(range(len(self._value.list_value.values))):
|
|
1143
1194
|
if ix not in self._unknowns:
|
|
1144
1195
|
break
|
|
1145
1196
|
del self._value.list_value[ix]
|
|
1146
|
-
case
|
|
1197
|
+
case "ListValue":
|
|
1147
1198
|
if key < len(self._value.values):
|
|
1148
1199
|
self._value.values[key].Clear()
|
|
1149
1200
|
for ix in reversed(range(len(self._value.values))):
|
|
@@ -1158,30 +1209,30 @@ class Value:
|
|
|
1158
1209
|
if self._readOnly:
|
|
1159
1210
|
raise ValueError(f"{self._readOnly} is read only")
|
|
1160
1211
|
kind = self._kind
|
|
1161
|
-
if kind ==
|
|
1212
|
+
if kind == "Unknown":
|
|
1162
1213
|
return
|
|
1163
1214
|
key = self._validate_key(key)
|
|
1164
1215
|
if isinstance(key, str):
|
|
1165
1216
|
match kind:
|
|
1166
|
-
case
|
|
1217
|
+
case "struct_value":
|
|
1167
1218
|
if key in self._value.struct_value.fields:
|
|
1168
1219
|
del self._value.struct_value[key]
|
|
1169
|
-
case
|
|
1220
|
+
case "Struct":
|
|
1170
1221
|
if key in self._value.fields:
|
|
1171
1222
|
del self._value[key]
|
|
1172
1223
|
case _:
|
|
1173
|
-
raise ValueError(f
|
|
1224
|
+
raise ValueError(f'Invalid key "{key}" for kind: {self._kind}')
|
|
1174
1225
|
self._cache.pop(key, None)
|
|
1175
1226
|
self._dependencies.pop(key, None)
|
|
1176
1227
|
self._unknowns.pop(key, None)
|
|
1177
1228
|
elif isinstance(key, int):
|
|
1178
1229
|
match kind:
|
|
1179
|
-
case
|
|
1230
|
+
case "list_value":
|
|
1180
1231
|
values = self._value.list_value
|
|
1181
|
-
case
|
|
1232
|
+
case "ListValue":
|
|
1182
1233
|
values = self._value
|
|
1183
1234
|
case _:
|
|
1184
|
-
raise ValueError(f
|
|
1235
|
+
raise ValueError(f'Invalid key "{key}" for kind: {self._kind}')
|
|
1185
1236
|
if key < len(values.values):
|
|
1186
1237
|
del values[key]
|
|
1187
1238
|
self._cache.pop(key, None)
|
|
@@ -1209,14 +1260,14 @@ class Value:
|
|
|
1209
1260
|
raise ValueError(f"{self._readOnly} is read only")
|
|
1210
1261
|
key = self._validate_key(key)
|
|
1211
1262
|
if isinstance(key, str):
|
|
1212
|
-
if self._ensure_map() ==
|
|
1263
|
+
if self._ensure_map() == "struct_value":
|
|
1213
1264
|
fields = self._value.struct_value.fields
|
|
1214
1265
|
else:
|
|
1215
1266
|
fields = self._value.fields
|
|
1216
1267
|
fields[key].Clear()
|
|
1217
1268
|
return fields[key]
|
|
1218
1269
|
if isinstance(key, int):
|
|
1219
|
-
if self._ensure_list() ==
|
|
1270
|
+
if self._ensure_list() == "list_value":
|
|
1220
1271
|
values = self._value.list_value.values
|
|
1221
1272
|
else:
|
|
1222
1273
|
values = self._value.values
|
|
@@ -1241,55 +1292,61 @@ class Value:
|
|
|
1241
1292
|
|
|
1242
1293
|
def _ensure_map(self):
|
|
1243
1294
|
kind = self._kind
|
|
1244
|
-
if kind ==
|
|
1295
|
+
if kind == "Unknown":
|
|
1245
1296
|
if self._parent is None:
|
|
1246
|
-
self.__dict__[
|
|
1297
|
+
self.__dict__["_value"] = google.protobuf.struct_pb2.Value()
|
|
1247
1298
|
else:
|
|
1248
|
-
self.__dict__[
|
|
1249
|
-
if
|
|
1299
|
+
self.__dict__["_value"] = self._parent._create_child(self._key)
|
|
1300
|
+
if (
|
|
1301
|
+
isinstance(self._value, google.protobuf.struct_pb2.Value)
|
|
1302
|
+
and self._value.WhichOneof("kind") is None
|
|
1303
|
+
):
|
|
1250
1304
|
self._value.struct_value.Clear()
|
|
1251
1305
|
kind = self._kind
|
|
1252
|
-
if kind not in (
|
|
1306
|
+
if kind not in ("struct_value", "Struct"):
|
|
1253
1307
|
raise ValueError(f"Invalid map kind: {kind}")
|
|
1254
1308
|
return kind
|
|
1255
1309
|
|
|
1256
1310
|
def _ensure_list(self):
|
|
1257
1311
|
kind = self._kind
|
|
1258
|
-
if kind ==
|
|
1312
|
+
if kind == "Unknown":
|
|
1259
1313
|
if self._parent is None:
|
|
1260
|
-
self.__dict__[
|
|
1314
|
+
self.__dict__["_value"] = google.protobuf.struct_pb2.Value()
|
|
1261
1315
|
else:
|
|
1262
|
-
self.__dict__[
|
|
1263
|
-
if
|
|
1316
|
+
self.__dict__["_value"] = self._parent._create_child(self._key)
|
|
1317
|
+
if (
|
|
1318
|
+
isinstance(self._value, google.protobuf.struct_pb2.Value)
|
|
1319
|
+
and self._value.WhichOneof("kind") is None
|
|
1320
|
+
):
|
|
1264
1321
|
self._value.list_value.Clear()
|
|
1265
1322
|
kind = self._kind
|
|
1266
|
-
if kind not in (
|
|
1323
|
+
if kind not in ("list_value", "ListValue"):
|
|
1267
1324
|
raise ValueError(f"Invalid list kind: {kind}")
|
|
1268
1325
|
return kind
|
|
1269
1326
|
|
|
1270
1327
|
@property
|
|
1271
1328
|
def _kind(self):
|
|
1272
1329
|
if isinstance(self._value, google.protobuf.struct_pb2.Value):
|
|
1273
|
-
return self._value.WhichOneof(
|
|
1330
|
+
return self._value.WhichOneof("kind") or "Unknown"
|
|
1274
1331
|
if isinstance(self._value, google.protobuf.struct_pb2.Struct):
|
|
1275
|
-
return
|
|
1332
|
+
return "Struct"
|
|
1276
1333
|
if isinstance(self._value, google.protobuf.struct_pb2.ListValue):
|
|
1277
|
-
return
|
|
1334
|
+
return "ListValue"
|
|
1278
1335
|
if self._value is _Unknown:
|
|
1279
|
-
return
|
|
1336
|
+
return "Unknown"
|
|
1280
1337
|
raise ValueError(f"Unexpected value type: {self._value.__class__}")
|
|
1281
1338
|
|
|
1282
1339
|
@property
|
|
1283
1340
|
def _isUnknown(self):
|
|
1284
|
-
return self._kind ==
|
|
1341
|
+
return self._kind == "Unknown"
|
|
1285
1342
|
|
|
1286
1343
|
@property
|
|
1287
1344
|
def _isMap(self):
|
|
1288
|
-
return self._kind in (
|
|
1345
|
+
return self._kind in ("struct_value", "Struct")
|
|
1289
1346
|
|
|
1290
1347
|
@property
|
|
1291
1348
|
def _isList(self):
|
|
1292
|
-
return self._kind in (
|
|
1349
|
+
return self._kind in ("list_value", "ListValue")
|
|
1293
1350
|
|
|
1294
1351
|
@property
|
|
1295
1352
|
def _getUnknowns(self):
|
|
@@ -1330,13 +1387,21 @@ class Value:
|
|
|
1330
1387
|
for key, value in self:
|
|
1331
1388
|
if isinstance(value, Value) and len(value):
|
|
1332
1389
|
patch = patches[key]
|
|
1333
|
-
if
|
|
1390
|
+
if (
|
|
1391
|
+
isinstance(patch, Value)
|
|
1392
|
+
and patch._kind == value._kind
|
|
1393
|
+
and len(patch)
|
|
1394
|
+
):
|
|
1334
1395
|
value._patchUnknowns(patch)
|
|
1335
1396
|
elif self._isList:
|
|
1336
1397
|
for ix, value in enumerate(self):
|
|
1337
1398
|
if isinstance(value, Value) and len(value):
|
|
1338
1399
|
patch = patches[ix]
|
|
1339
|
-
if
|
|
1400
|
+
if (
|
|
1401
|
+
isinstance(patch, Value)
|
|
1402
|
+
and patch._kind == value._kind
|
|
1403
|
+
and len(patch)
|
|
1404
|
+
):
|
|
1340
1405
|
value._patchUnknowns(patch)
|
|
1341
1406
|
|
|
1342
1407
|
def _renderUnknowns(self, trimFullName):
|
|
@@ -1353,13 +1418,13 @@ class Value:
|
|
|
1353
1418
|
value._renderUnknowns(trimFullName)
|
|
1354
1419
|
|
|
1355
1420
|
|
|
1356
|
-
def _formatObject(object, spec=
|
|
1421
|
+
def _formatObject(object, spec="yaml"):
|
|
1357
1422
|
match spec:
|
|
1358
|
-
case
|
|
1423
|
+
case "json":
|
|
1359
1424
|
return json.dumps(object, indent=2, cls=_JSONEncoder)
|
|
1360
|
-
case
|
|
1361
|
-
return json.dumps(object, separators=(
|
|
1362
|
-
case
|
|
1425
|
+
case "jsonc":
|
|
1426
|
+
return json.dumps(object, separators=(",", ":"), cls=_JSONEncoder)
|
|
1427
|
+
case "protobuf":
|
|
1363
1428
|
if isinstance(object, Message):
|
|
1364
1429
|
return str(object._message)
|
|
1365
1430
|
if isinstance(object, (MapMessage, RepeatedMessage)):
|
|
@@ -1385,34 +1450,35 @@ class _JSONEncoder(json.JSONEncoder):
|
|
|
1385
1450
|
return object._value
|
|
1386
1451
|
if isinstance(object, Value):
|
|
1387
1452
|
match object._kind:
|
|
1388
|
-
case
|
|
1453
|
+
case "struct_value" | "Struc":
|
|
1389
1454
|
return {key: value for key, value in object}
|
|
1390
|
-
case
|
|
1455
|
+
case "list_value" | "ListValue":
|
|
1391
1456
|
return [value for value in object]
|
|
1392
|
-
case
|
|
1457
|
+
case "string_value":
|
|
1393
1458
|
return object._value.string_value
|
|
1394
|
-
case
|
|
1459
|
+
case "null_value":
|
|
1395
1460
|
return None
|
|
1396
|
-
case
|
|
1461
|
+
case "number_value":
|
|
1397
1462
|
value = object._value.number_value
|
|
1398
1463
|
if value.is_integer():
|
|
1399
1464
|
value = int(value)
|
|
1400
1465
|
return value
|
|
1401
|
-
case
|
|
1466
|
+
case "bool_value":
|
|
1402
1467
|
return object._value.bool_value
|
|
1403
|
-
case
|
|
1404
|
-
return
|
|
1468
|
+
case "Unknown":
|
|
1469
|
+
return "<<UNKNOWN>>"
|
|
1405
1470
|
case _:
|
|
1406
|
-
return
|
|
1471
|
+
return "<<UNEXPECTED>>"
|
|
1407
1472
|
if isinstance(object, datetime.datetime):
|
|
1408
1473
|
return object.isoformat()
|
|
1409
|
-
return super(
|
|
1474
|
+
return super().default(object)
|
|
1410
1475
|
|
|
1411
1476
|
|
|
1412
1477
|
class _Dumper(yaml.SafeDumper):
|
|
1413
|
-
|
|
1414
1478
|
def represent_str(self, data):
|
|
1415
|
-
return self.represent_scalar(
|
|
1479
|
+
return self.represent_scalar(
|
|
1480
|
+
"tag:yaml.org,2002:str", data, "|" if "\n" in data else None
|
|
1481
|
+
)
|
|
1416
1482
|
|
|
1417
1483
|
def represent_message_dict(self, message):
|
|
1418
1484
|
return self.represent_dict({key: value for key, value in message})
|
|
@@ -1436,30 +1502,31 @@ class _Dumper(yaml.SafeDumper):
|
|
|
1436
1502
|
if isinstance(field._value, bool):
|
|
1437
1503
|
return self.represent_bool(field._value)
|
|
1438
1504
|
if field._value is _Unknown:
|
|
1439
|
-
return self.represent_str(
|
|
1440
|
-
return self.represent_str(
|
|
1505
|
+
return self.represent_str("<<UNKNOWN>>")
|
|
1506
|
+
return self.represent_str("<<UNEXPECTED>>")
|
|
1441
1507
|
|
|
1442
1508
|
def represent_value(self, value):
|
|
1443
1509
|
match value._kind:
|
|
1444
|
-
case
|
|
1445
|
-
return self.represent_dict({k:v for k,v in value})
|
|
1446
|
-
case
|
|
1510
|
+
case "struct_value" | "Struct":
|
|
1511
|
+
return self.represent_dict({k: v for k, v in value})
|
|
1512
|
+
case "list_value" | "ListValue":
|
|
1447
1513
|
return self.represent_list([v for v in value])
|
|
1448
|
-
case
|
|
1514
|
+
case "string_value":
|
|
1449
1515
|
return self.represent_str(value._value.string_value)
|
|
1450
|
-
case
|
|
1516
|
+
case "null_value":
|
|
1451
1517
|
return self.represent_none(None)
|
|
1452
|
-
case
|
|
1518
|
+
case "number_value":
|
|
1453
1519
|
value = value._value.number_value
|
|
1454
1520
|
if value.is_integer():
|
|
1455
1521
|
return self.represent_int(int(value))
|
|
1456
1522
|
return self.represent_float(value)
|
|
1457
|
-
case
|
|
1523
|
+
case "bool_value":
|
|
1458
1524
|
return self.represent_bool(value._value.bool_value)
|
|
1459
|
-
case
|
|
1460
|
-
return self.represent_str(
|
|
1525
|
+
case "Unknown":
|
|
1526
|
+
return self.represent_str("<<UNKNOWN>>")
|
|
1461
1527
|
case _:
|
|
1462
|
-
return self.represent_str(
|
|
1528
|
+
return self.represent_str("<<UNEXPECTED>>")
|
|
1529
|
+
|
|
1463
1530
|
|
|
1464
1531
|
_Dumper.add_representer(str, _Dumper.represent_str)
|
|
1465
1532
|
_Dumper.add_representer(Message, _Dumper.represent_message_dict)
|