author | Jordi Guti?rrez Hermoso <jordigh@octave.org> |
Thu, 12 Dec 2019 11:41:28 -0500 | |
changeset 43886 | fe0daceb51d0 |
parent 37126 | 4bd73a955ab0 |
child 52641 | 9bd6854aab86 |
permissions | -rw-r--r-- |
37126
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
1 |
import re |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
2 |
import struct |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
3 |
from collections import OrderedDict, defaultdict |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
4 |
from contextlib import contextmanager |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
5 |
from functools import wraps |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
6 |
from datetime import datetime, date, time |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
7 |
from io import BytesIO |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
8 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
9 |
from .compat import ( |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
10 |
iteritems, timezone, long, unicode, as_unicode, bytes_from_list, pack_float16, unpack_float16) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
11 |
from .types import CBORTag, undefined, CBORSimpleValue |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
12 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
13 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
14 |
class CBOREncodeError(Exception): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
15 |
"""Raised when an error occurs while serializing an object into a CBOR datastream.""" |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
16 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
17 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
18 |
def shareable_encoder(func): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
19 |
""" |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
20 |
Wrap the given encoder function to gracefully handle cyclic data structures. |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
21 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
22 |
If value sharing is enabled, this marks the given value shared in the datastream on the |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
23 |
first call. If the value has already been passed to this method, a reference marker is |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
24 |
instead written to the data stream and the wrapped function is not called. |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
25 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
26 |
If value sharing is disabled, only infinite recursion protection is done. |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
27 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
28 |
""" |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
29 |
@wraps(func) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
30 |
def wrapper(encoder, value, *args, **kwargs): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
31 |
value_id = id(value) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
32 |
container, container_index = encoder._shared_containers.get(value_id, (None, None)) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
33 |
if encoder.value_sharing: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
34 |
if container is value: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
35 |
# Generate a reference to the previous index instead of encoding this again |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
36 |
encoder.write(encode_length(0xd8, 0x1d)) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
37 |
encode_int(encoder, container_index) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
38 |
else: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
39 |
# Mark the container as shareable |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
40 |
encoder._shared_containers[value_id] = (value, len(encoder._shared_containers)) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
41 |
encoder.write(encode_length(0xd8, 0x1c)) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
42 |
func(encoder, value, *args, **kwargs) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
43 |
else: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
44 |
if container is value: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
45 |
raise CBOREncodeError('cyclic data structure detected but value sharing is ' |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
46 |
'disabled') |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
47 |
else: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
48 |
encoder._shared_containers[value_id] = (value, None) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
49 |
func(encoder, value, *args, **kwargs) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
50 |
del encoder._shared_containers[value_id] |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
51 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
52 |
return wrapper |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
53 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
54 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
55 |
def encode_length(major_tag, length): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
56 |
if length < 24: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
57 |
return struct.pack('>B', major_tag | length) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
58 |
elif length < 256: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
59 |
return struct.pack('>BB', major_tag | 24, length) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
60 |
elif length < 65536: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
61 |
return struct.pack('>BH', major_tag | 25, length) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
62 |
elif length < 4294967296: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
63 |
return struct.pack('>BL', major_tag | 26, length) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
64 |
else: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
65 |
return struct.pack('>BQ', major_tag | 27, length) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
66 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
67 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
68 |
def encode_int(encoder, value): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
69 |
# Big integers (2 ** 64 and over) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
70 |
if value >= 18446744073709551616 or value < -18446744073709551616: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
71 |
if value >= 0: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
72 |
major_type = 0x02 |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
73 |
else: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
74 |
major_type = 0x03 |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
75 |
value = -value - 1 |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
76 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
77 |
values = [] |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
78 |
while value > 0: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
79 |
value, remainder = divmod(value, 256) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
80 |
values.insert(0, remainder) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
81 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
82 |
payload = bytes_from_list(values) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
83 |
encode_semantic(encoder, CBORTag(major_type, payload)) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
84 |
elif value >= 0: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
85 |
encoder.write(encode_length(0, value)) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
86 |
else: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
87 |
encoder.write(encode_length(0x20, abs(value) - 1)) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
88 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
89 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
90 |
def encode_bytestring(encoder, value): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
91 |
encoder.write(encode_length(0x40, len(value)) + value) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
92 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
93 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
94 |
def encode_bytearray(encoder, value): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
95 |
encode_bytestring(encoder, bytes(value)) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
96 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
97 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
98 |
def encode_string(encoder, value): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
99 |
encoded = value.encode('utf-8') |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
100 |
encoder.write(encode_length(0x60, len(encoded)) + encoded) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
101 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
102 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
103 |
@shareable_encoder |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
104 |
def encode_array(encoder, value): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
105 |
encoder.write(encode_length(0x80, len(value))) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
106 |
for item in value: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
107 |
encoder.encode(item) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
108 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
109 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
110 |
@shareable_encoder |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
111 |
def encode_map(encoder, value): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
112 |
encoder.write(encode_length(0xa0, len(value))) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
113 |
for key, val in iteritems(value): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
114 |
encoder.encode(key) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
115 |
encoder.encode(val) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
116 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
117 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
118 |
def encode_sortable_key(encoder, value): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
119 |
"""Takes a key and calculates the length of its optimal byte representation""" |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
120 |
encoded = encoder.encode_to_bytes(value) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
121 |
return len(encoded), encoded |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
122 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
123 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
124 |
@shareable_encoder |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
125 |
def encode_canonical_map(encoder, value): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
126 |
"""Reorder keys according to Canonical CBOR specification""" |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
127 |
keyed_keys = ((encode_sortable_key(encoder, key), key) for key in value.keys()) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
128 |
encoder.write(encode_length(0xa0, len(value))) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
129 |
for sortkey, realkey in sorted(keyed_keys): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
130 |
encoder.write(sortkey[1]) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
131 |
encoder.encode(value[realkey]) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
132 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
133 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
134 |
def encode_semantic(encoder, value): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
135 |
encoder.write(encode_length(0xc0, value.tag)) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
136 |
encoder.encode(value.value) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
137 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
138 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
139 |
# |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
140 |
# Semantic decoders (major tag 6) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
141 |
# |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
142 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
143 |
def encode_datetime(encoder, value): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
144 |
# Semantic tag 0 |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
145 |
if not value.tzinfo: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
146 |
if encoder.timezone: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
147 |
value = value.replace(tzinfo=encoder.timezone) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
148 |
else: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
149 |
raise CBOREncodeError( |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
150 |
'naive datetime encountered and no default timezone has been set') |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
151 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
152 |
if encoder.datetime_as_timestamp: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
153 |
from calendar import timegm |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
154 |
timestamp = timegm(value.utctimetuple()) + value.microsecond // 1000000 |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
155 |
encode_semantic(encoder, CBORTag(1, timestamp)) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
156 |
else: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
157 |
datestring = as_unicode(value.isoformat().replace('+00:00', 'Z')) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
158 |
encode_semantic(encoder, CBORTag(0, datestring)) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
159 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
160 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
161 |
def encode_date(encoder, value): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
162 |
value = datetime.combine(value, time()).replace(tzinfo=timezone.utc) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
163 |
encode_datetime(encoder, value) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
164 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
165 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
166 |
def encode_decimal(encoder, value): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
167 |
# Semantic tag 4 |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
168 |
if value.is_nan(): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
169 |
encoder.write(b'\xf9\x7e\x00') |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
170 |
elif value.is_infinite(): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
171 |
encoder.write(b'\xf9\x7c\x00' if value > 0 else b'\xf9\xfc\x00') |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
172 |
else: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
173 |
dt = value.as_tuple() |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
174 |
mantissa = sum(d * 10 ** i for i, d in enumerate(reversed(dt.digits))) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
175 |
with encoder.disable_value_sharing(): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
176 |
encode_semantic(encoder, CBORTag(4, [dt.exponent, mantissa])) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
177 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
178 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
179 |
def encode_rational(encoder, value): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
180 |
# Semantic tag 30 |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
181 |
with encoder.disable_value_sharing(): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
182 |
encode_semantic(encoder, CBORTag(30, [value.numerator, value.denominator])) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
183 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
184 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
185 |
def encode_regexp(encoder, value): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
186 |
# Semantic tag 35 |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
187 |
encode_semantic(encoder, CBORTag(35, as_unicode(value.pattern))) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
188 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
189 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
190 |
def encode_mime(encoder, value): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
191 |
# Semantic tag 36 |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
192 |
encode_semantic(encoder, CBORTag(36, as_unicode(value.as_string()))) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
193 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
194 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
195 |
def encode_uuid(encoder, value): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
196 |
# Semantic tag 37 |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
197 |
encode_semantic(encoder, CBORTag(37, value.bytes)) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
198 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
199 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
200 |
def encode_set(encoder, value): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
201 |
# Semantic tag 258 |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
202 |
encode_semantic(encoder, CBORTag(258, tuple(value))) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
203 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
204 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
205 |
def encode_canonical_set(encoder, value): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
206 |
# Semantic tag 258 |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
207 |
values = sorted([(encode_sortable_key(encoder, key), key) for key in value]) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
208 |
encode_semantic(encoder, CBORTag(258, [key[1] for key in values])) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
209 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
210 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
211 |
# |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
212 |
# Special encoders (major tag 7) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
213 |
# |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
214 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
215 |
def encode_simple_value(encoder, value): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
216 |
if value.value < 20: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
217 |
encoder.write(struct.pack('>B', 0xe0 | value.value)) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
218 |
else: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
219 |
encoder.write(struct.pack('>BB', 0xf8, value.value)) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
220 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
221 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
222 |
def encode_float(encoder, value): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
223 |
# Handle special values efficiently |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
224 |
import math |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
225 |
if math.isnan(value): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
226 |
encoder.write(b'\xf9\x7e\x00') |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
227 |
elif math.isinf(value): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
228 |
encoder.write(b'\xf9\x7c\x00' if value > 0 else b'\xf9\xfc\x00') |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
229 |
else: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
230 |
encoder.write(struct.pack('>Bd', 0xfb, value)) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
231 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
232 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
233 |
def encode_minimal_float(encoder, value): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
234 |
# Handle special values efficiently |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
235 |
import math |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
236 |
if math.isnan(value): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
237 |
encoder.write(b'\xf9\x7e\x00') |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
238 |
elif math.isinf(value): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
239 |
encoder.write(b'\xf9\x7c\x00' if value > 0 else b'\xf9\xfc\x00') |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
240 |
else: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
241 |
encoded = struct.pack('>Bf', 0xfa, value) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
242 |
if struct.unpack('>Bf', encoded)[1] != value: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
243 |
encoded = struct.pack('>Bd', 0xfb, value) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
244 |
encoder.write(encoded) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
245 |
else: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
246 |
f16 = pack_float16(value) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
247 |
if f16 and unpack_float16(f16[1:]) == value: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
248 |
encoder.write(f16) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
249 |
else: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
250 |
encoder.write(encoded) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
251 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
252 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
253 |
def encode_boolean(encoder, value): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
254 |
encoder.write(b'\xf5' if value else b'\xf4') |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
255 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
256 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
257 |
def encode_none(encoder, value): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
258 |
encoder.write(b'\xf6') |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
259 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
260 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
261 |
def encode_undefined(encoder, value): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
262 |
encoder.write(b'\xf7') |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
263 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
264 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
265 |
default_encoders = OrderedDict([ |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
266 |
(bytes, encode_bytestring), |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
267 |
(bytearray, encode_bytearray), |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
268 |
(unicode, encode_string), |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
269 |
(int, encode_int), |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
270 |
(long, encode_int), |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
271 |
(float, encode_float), |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
272 |
(('decimal', 'Decimal'), encode_decimal), |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
273 |
(bool, encode_boolean), |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
274 |
(type(None), encode_none), |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
275 |
(tuple, encode_array), |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
276 |
(list, encode_array), |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
277 |
(dict, encode_map), |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
278 |
(defaultdict, encode_map), |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
279 |
(OrderedDict, encode_map), |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
280 |
(type(undefined), encode_undefined), |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
281 |
(datetime, encode_datetime), |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
282 |
(date, encode_date), |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
283 |
(type(re.compile('')), encode_regexp), |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
284 |
(('fractions', 'Fraction'), encode_rational), |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
285 |
(('email.message', 'Message'), encode_mime), |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
286 |
(('uuid', 'UUID'), encode_uuid), |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
287 |
(CBORSimpleValue, encode_simple_value), |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
288 |
(CBORTag, encode_semantic), |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
289 |
(set, encode_set), |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
290 |
(frozenset, encode_set) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
291 |
]) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
292 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
293 |
canonical_encoders = OrderedDict([ |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
294 |
(float, encode_minimal_float), |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
295 |
(dict, encode_canonical_map), |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
296 |
(defaultdict, encode_canonical_map), |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
297 |
(OrderedDict, encode_canonical_map), |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
298 |
(set, encode_canonical_set), |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
299 |
(frozenset, encode_canonical_set) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
300 |
]) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
301 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
302 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
303 |
class CBOREncoder(object): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
304 |
""" |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
305 |
Serializes objects to a byte stream using Concise Binary Object Representation. |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
306 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
307 |
:param datetime_as_timestamp: set to ``True`` to serialize datetimes as UNIX timestamps |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
308 |
(this makes datetimes more concise on the wire but loses the time zone information) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
309 |
:param datetime.tzinfo timezone: the default timezone to use for serializing naive datetimes |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
310 |
:param value_sharing: if ``True``, allows more efficient serializing of repeated values and, |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
311 |
more importantly, cyclic data structures, at the cost of extra line overhead |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
312 |
:param default: a callable that is called by the encoder with three arguments |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
313 |
(encoder, value, file object) when no suitable encoder has been found, and should use the |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
314 |
methods on the encoder to encode any objects it wants to add to the data stream |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
315 |
:param canonical: Forces mapping types to be output in a stable order to guarantee that the |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
316 |
output will always produce the same hash given the same input. |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
317 |
""" |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
318 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
319 |
__slots__ = ('fp', 'datetime_as_timestamp', 'timezone', 'default', 'value_sharing', |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
320 |
'json_compatible', '_shared_containers', '_encoders') |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
321 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
322 |
def __init__(self, fp, datetime_as_timestamp=False, timezone=None, value_sharing=False, |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
323 |
default=None, canonical=False): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
324 |
self.fp = fp |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
325 |
self.datetime_as_timestamp = datetime_as_timestamp |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
326 |
self.timezone = timezone |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
327 |
self.value_sharing = value_sharing |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
328 |
self.default = default |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
329 |
self._shared_containers = {} # indexes used for value sharing |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
330 |
self._encoders = default_encoders.copy() |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
331 |
if canonical: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
332 |
self._encoders.update(canonical_encoders) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
333 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
334 |
def _find_encoder(self, obj_type): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
335 |
from sys import modules |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
336 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
337 |
for type_, enc in list(iteritems(self._encoders)): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
338 |
if type(type_) is tuple: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
339 |
modname, typename = type_ |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
340 |
imported_type = getattr(modules.get(modname), typename, None) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
341 |
if imported_type is not None: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
342 |
del self._encoders[type_] |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
343 |
self._encoders[imported_type] = enc |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
344 |
type_ = imported_type |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
345 |
else: # pragma: nocover |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
346 |
continue |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
347 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
348 |
if issubclass(obj_type, type_): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
349 |
self._encoders[obj_type] = enc |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
350 |
return enc |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
351 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
352 |
return None |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
353 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
354 |
@contextmanager |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
355 |
def disable_value_sharing(self): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
356 |
"""Disable value sharing in the encoder for the duration of the context block.""" |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
357 |
old_value_sharing = self.value_sharing |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
358 |
self.value_sharing = False |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
359 |
yield |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
360 |
self.value_sharing = old_value_sharing |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
361 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
362 |
def write(self, data): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
363 |
""" |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
364 |
Write bytes to the data stream. |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
365 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
366 |
:param data: the bytes to write |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
367 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
368 |
""" |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
369 |
self.fp.write(data) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
370 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
371 |
def encode(self, obj): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
372 |
""" |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
373 |
Encode the given object using CBOR. |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
374 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
375 |
:param obj: the object to encode |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
376 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
377 |
""" |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
378 |
obj_type = obj.__class__ |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
379 |
encoder = self._encoders.get(obj_type) or self._find_encoder(obj_type) or self.default |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
380 |
if not encoder: |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
381 |
raise CBOREncodeError('cannot serialize type %s' % obj_type.__name__) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
382 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
383 |
encoder(self, obj) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
384 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
385 |
def encode_to_bytes(self, obj): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
386 |
""" |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
387 |
Encode the given object to a byte buffer and return its value as bytes. |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
388 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
389 |
This method was intended to be used from the ``default`` hook when an object needs to be |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
390 |
encoded separately from the rest but while still taking advantage of the shared value |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
391 |
registry. |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
392 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
393 |
""" |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
394 |
old_fp = self.fp |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
395 |
self.fp = fp = BytesIO() |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
396 |
self.encode(obj) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
397 |
self.fp = old_fp |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
398 |
return fp.getvalue() |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
399 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
400 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
401 |
def dumps(obj, **kwargs): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
402 |
""" |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
403 |
Serialize an object to a bytestring. |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
404 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
405 |
:param obj: the object to serialize |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
406 |
:param kwargs: keyword arguments passed to :class:`~.CBOREncoder` |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
407 |
:return: the serialized output |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
408 |
:rtype: bytes |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
409 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
410 |
""" |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
411 |
fp = BytesIO() |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
412 |
dump(obj, fp, **kwargs) |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
413 |
return fp.getvalue() |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
414 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
415 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
416 |
def dump(obj, fp, **kwargs): |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
417 |
""" |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
418 |
Serialize an object to a file. |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
419 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
420 |
:param obj: the object to serialize |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
421 |
:param fp: a file-like object |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
422 |
:param kwargs: keyword arguments passed to :class:`~.CBOREncoder` |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
423 |
|
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
424 |
""" |
4bd73a955ab0
thirdparty: vendor cbor2 python library
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
425 |
CBOREncoder(fp, **kwargs).encode(obj) |