This repository was archived by the owner on Sep 18, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 21
Expand file tree
/
Copy pathconversions.py
More file actions
120 lines (87 loc) · 3.54 KB
/
conversions.py
File metadata and controls
120 lines (87 loc) · 3.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import json
import re
from typing import List, Optional, Union, Iterable, Type
import betterproto
from temporal.api.common.v1 import Payload, Payloads
def camel_to_snake(name):
s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name)
return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).lower()
def snake_to_camel(snake_str):
components = snake_str.split('_')
# We capitalize the first letter of each component except the first one
# with the 'title' method and join them together.
return components[0] + ''.join(x.title() for x in components[1:])
def snake_to_title(snake_str):
components = snake_str.split('_')
return ''.join(x.title() for x in components)
METADATA_ENCODING_KEY = "encoding"
METADATA_ENCODING_NULL_NAME = "binary/null"
METADATA_ENCODING_NULL = METADATA_ENCODING_NULL_NAME.encode("utf-8")
METADATA_ENCODING_RAW_NAME = "binary/plain"
METADATA_ENCODING_RAW = METADATA_ENCODING_RAW_NAME.encode("utf-8")
METADATA_ENCODING_JSON_NAME = "json/plain"
METADATA_ENCODING_JSON = METADATA_ENCODING_JSON_NAME.encode("utf-8")
METADATA_ENCODING_PROTOBUF_JSON_NAME = "json/protobuf"
METADATA_ENCODING_PROTOBUF_JSON = METADATA_ENCODING_PROTOBUF_JSON_NAME.encode("utf-8")
# TODO: Implement encode/decode for these:
METADATA_ENCODING_PROTOBUF_NAME = "binary/protobuf"
METADATA_ENCODING_PROTOBUF = METADATA_ENCODING_PROTOBUF_NAME.encode('utf-8')
def encode_null(value: object) -> Optional[Payload]:
if value is None:
p: Payload = Payload()
p.metadata = {METADATA_ENCODING_KEY: METADATA_ENCODING_NULL}
p.data = bytes()
return p
else:
return None
# noinspection PyUnusedLocal
def decode_null(payload: Payload, type_hint) -> object:
return None
def encode_binary(value: object) -> Optional[Payload]:
if isinstance(value, bytes):
p: Payload = Payload()
p.metadata = {METADATA_ENCODING_KEY: METADATA_ENCODING_RAW}
p.data = value
return p
else:
return None
def decode_binary(payload: Payload, type_hint) -> object:
return payload.data
def encode_json_string(value: object) -> Payload:
# TODO:
# mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
# mapper.registerModule(new JavaTimeModule());
# mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
p: Payload = Payload()
p.metadata = {METADATA_ENCODING_KEY: METADATA_ENCODING_JSON}
p.data = json.dumps(value).encode("utf-8")
return p
def decode_json_string(payload: Payload, type_hint) -> object:
# TODO:
# mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
# mapper.registerModule(new JavaTimeModule());
# mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
b = str(payload.data, "utf-8")
return json.loads(b)
def encode_protobuf_json(value: object) -> Payload:
if not isinstance(value, betterproto.Message):
return None
p: Payload = Payload()
p.metadata = {METADATA_ENCODING_KEY: METADATA_ENCODING_PROTOBUF_JSON}
p.data = value.to_json().encode("utf-8")
return p
def decode_protobuf_json(payload: Payload, type_hint: Type[betterproto.Message]) -> betterproto.Message:
b = str(payload.data, "utf-8")
return type_hint().from_json(b)
ENCODINGS = [
encode_null,
encode_binary,
encode_protobuf_json,
encode_json_string
]
DECODINGS = {
METADATA_ENCODING_NULL: decode_null,
METADATA_ENCODING_RAW: decode_binary,
METADATA_ENCODING_PROTOBUF_JSON: decode_protobuf_json,
METADATA_ENCODING_JSON: decode_json_string
}