mercurial/thirdparty/cbor/cbor2/encoder.py
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--
hgweb: fix error in docstring Despite the subtle semantic difference, this sentence really meant to say "overridden", not "overwritten".
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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)