Mercurial > public > mercurial-scm > hg
annotate mercurial/thirdparty/cbor/cbor2/encoder.py @ 51571:9b51a4fb0f96
bundlespec: type the _bundlespeccontentopts dictionary
If only we had a tool to detect the kind of stupid error we just fixed? ho wait.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Tue, 09 Apr 2024 14:37:24 +0200 |
parents | 4bd73a955ab0 |
children | 9bd6854aab86 |
rev | line source |
---|---|
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) |