hgext3rd/evolve/thirdparty/cbor.py
author Pulkit Goyal <7895pulkit@gmail.com>
Fri, 12 Jan 2018 19:23:29 +0530
changeset 3390 b3dbba6e34c9
child 4714 c51fc0ae7a7e
permissions -rw-r--r--
evolve: start vendoring third party package cbor This patch adds a third party package named cbor. cbor is a data serialization format and this library provides API to convert Python Objects into cbor formatted data. To know more about cbor, hop onto cbor.io The files are copied from it's official bitbucket repository which is at https://bitbucket.org/bodhisnarkva/cbor/src/113f42203c941470c98f7174065ba9b384cff727/ cbor.py can be found at https://bitbucket.org/bodhisnarkva/cbor/src/113f42203c941470c98f7174065ba9b384cff727/py/cbor/cbor.py # no-check-commit as we are importing a third party package Modified test-check-flake8.t to not lint on thirdparty packages.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3390
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     1
#!python
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     2
# -*- Python -*-
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     3
#
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     4
# Copyright 2014-2015 Brian Olson
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     5
#
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     6
# Licensed under the Apache License, Version 2.0 (the "License");
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     7
# you may not use this file except in compliance with the License.
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     8
# You may obtain a copy of the License at
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     9
#
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    10
#     http://www.apache.org/licenses/LICENSE-2.0
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    11
#
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    12
# Unless required by applicable law or agreed to in writing, software
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    13
# distributed under the License is distributed on an "AS IS" BASIS,
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    14
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    15
# See the License for the specific language governing permissions and
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    16
# limitations under the License.
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    17
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    18
import datetime
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    19
import re
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    20
import struct
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    21
import sys
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    22
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    23
_IS_PY3 = sys.version_info[0] >= 3
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    24
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    25
if _IS_PY3:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    26
    from io import BytesIO as StringIO
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    27
else:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    28
    try:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    29
        from cStringIO import StringIO
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    30
    except:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    31
        from StringIO import StringIO
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    32
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    33
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    34
CBOR_TYPE_MASK = 0xE0  # top 3 bits
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    35
CBOR_INFO_BITS = 0x1F  # low 5 bits
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    36
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    37
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    38
CBOR_UINT    = 0x00
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    39
CBOR_NEGINT  = 0x20
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    40
CBOR_BYTES   = 0x40
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    41
CBOR_TEXT    = 0x60
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    42
CBOR_ARRAY   = 0x80
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    43
CBOR_MAP     = 0xA0
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    44
CBOR_TAG     = 0xC0
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    45
CBOR_7       = 0xE0  # float and other types
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    46
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    47
CBOR_UINT8_FOLLOWS  = 24  # 0x18
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    48
CBOR_UINT16_FOLLOWS = 25  # 0x19
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    49
CBOR_UINT32_FOLLOWS = 26  # 0x1a
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    50
CBOR_UINT64_FOLLOWS = 27  # 0x1b
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    51
CBOR_VAR_FOLLOWS    = 31  # 0x1f
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    52
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    53
CBOR_BREAK  = 0xFF
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    54
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    55
CBOR_FALSE  = (CBOR_7 | 20)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    56
CBOR_TRUE   = (CBOR_7 | 21)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    57
CBOR_NULL   = (CBOR_7 | 22)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    58
CBOR_UNDEFINED   = (CBOR_7 | 23)  # js 'undefined' value
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    59
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    60
CBOR_FLOAT16 = (CBOR_7 | 25)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    61
CBOR_FLOAT32 = (CBOR_7 | 26)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    62
CBOR_FLOAT64 = (CBOR_7 | 27)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    63
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    64
CBOR_TAG_DATE_STRING = 0 # RFC3339
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    65
CBOR_TAG_DATE_ARRAY = 1 # any number type follows, seconds since 1970-01-01T00:00:00 UTC
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    66
CBOR_TAG_BIGNUM = 2 # big endian byte string follows
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    67
CBOR_TAG_NEGBIGNUM = 3 # big endian byte string follows
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    68
CBOR_TAG_DECIMAL = 4 # [ 10^x exponent, number ]
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    69
CBOR_TAG_BIGFLOAT = 5 # [ 2^x exponent, number ]
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    70
CBOR_TAG_BASE64URL = 21
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    71
CBOR_TAG_BASE64 = 22
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    72
CBOR_TAG_BASE16 = 23
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    73
CBOR_TAG_CBOR = 24 # following byte string is embedded CBOR data
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    74
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    75
CBOR_TAG_URI = 32
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    76
CBOR_TAG_BASE64URL = 33
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    77
CBOR_TAG_BASE64 = 34
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    78
CBOR_TAG_REGEX = 35
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    79
CBOR_TAG_MIME = 36 # following text is MIME message, headers, separators and all
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    80
CBOR_TAG_CBOR_FILEHEADER = 55799 # can open a file with 0xd9d9f7
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    81
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    82
_CBOR_TAG_BIGNUM_BYTES = struct.pack('B', CBOR_TAG | CBOR_TAG_BIGNUM)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    83
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    84
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    85
def dumps_int(val):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    86
    "return bytes representing int val in CBOR"
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    87
    if val >= 0:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    88
        # CBOR_UINT is 0, so I'm lazy/efficient about not OR-ing it in.
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    89
        if val <= 23:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    90
            return struct.pack('B', val)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    91
        if val <= 0x0ff:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    92
            return struct.pack('BB', CBOR_UINT8_FOLLOWS, val)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    93
        if val <= 0x0ffff:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    94
            return struct.pack('!BH', CBOR_UINT16_FOLLOWS, val)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    95
        if val <= 0x0ffffffff:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    96
            return struct.pack('!BI', CBOR_UINT32_FOLLOWS, val)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    97
        if val <= 0x0ffffffffffffffff:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    98
            return struct.pack('!BQ', CBOR_UINT64_FOLLOWS, val)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    99
        outb = _dumps_bignum_to_bytearray(val)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   100
        return _CBOR_TAG_BIGNUM_BYTES + _encode_type_num(CBOR_BYTES, len(outb)) + outb
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   101
    val = -1 - val
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   102
    return _encode_type_num(CBOR_NEGINT, val)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   103
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   104
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   105
if _IS_PY3:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   106
    def _dumps_bignum_to_bytearray(val):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   107
        out = []
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   108
        while val > 0:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   109
            out.insert(0, val & 0x0ff)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   110
            val = val >> 8
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   111
        return bytes(out)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   112
else:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   113
    def _dumps_bignum_to_bytearray(val):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   114
        out = []
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   115
        while val > 0:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   116
            out.insert(0, chr(val & 0x0ff))
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   117
            val = val >> 8
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   118
        return b''.join(out)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   119
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   120
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   121
def dumps_float(val):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   122
    return struct.pack("!Bd", CBOR_FLOAT64, val)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   123
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   124
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   125
_CBOR_TAG_NEGBIGNUM_BYTES = struct.pack('B', CBOR_TAG | CBOR_TAG_NEGBIGNUM)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   126
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   127
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   128
def _encode_type_num(cbor_type, val):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   129
    """For some CBOR primary type [0..7] and an auxiliary unsigned number, return CBOR encoded bytes"""
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   130
    assert val >= 0
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   131
    if val <= 23:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   132
        return struct.pack('B', cbor_type | val)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   133
    if val <= 0x0ff:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   134
        return struct.pack('BB', cbor_type | CBOR_UINT8_FOLLOWS, val)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   135
    if val <= 0x0ffff:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   136
        return struct.pack('!BH', cbor_type | CBOR_UINT16_FOLLOWS, val)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   137
    if val <= 0x0ffffffff:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   138
        return struct.pack('!BI', cbor_type | CBOR_UINT32_FOLLOWS, val)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   139
    if (((cbor_type == CBOR_NEGINT) and (val <= 0x07fffffffffffffff)) or
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   140
        ((cbor_type != CBOR_NEGINT) and (val <= 0x0ffffffffffffffff))):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   141
        return struct.pack('!BQ', cbor_type | CBOR_UINT64_FOLLOWS, val)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   142
    if cbor_type != CBOR_NEGINT:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   143
        raise Exception("value too big for CBOR unsigned number: {0!r}".format(val))
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   144
    outb = _dumps_bignum_to_bytearray(val)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   145
    return _CBOR_TAG_NEGBIGNUM_BYTES + _encode_type_num(CBOR_BYTES, len(outb)) + outb
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   146
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   147
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   148
if _IS_PY3:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   149
    def _is_unicode(val):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   150
        return isinstance(val, str)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   151
else:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   152
    def _is_unicode(val):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   153
        return isinstance(val, unicode)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   154
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   155
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   156
def dumps_string(val, is_text=None, is_bytes=None):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   157
    if _is_unicode(val):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   158
        val = val.encode('utf8')
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   159
        is_text = True
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   160
        is_bytes = False
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   161
    if (is_bytes) or not (is_text == True):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   162
        return _encode_type_num(CBOR_BYTES, len(val)) + val
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   163
    return _encode_type_num(CBOR_TEXT, len(val)) + val
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   164
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   165
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   166
def dumps_array(arr, sort_keys=False):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   167
    head = _encode_type_num(CBOR_ARRAY, len(arr))
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   168
    parts = [dumps(x, sort_keys=sort_keys) for x in arr]
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   169
    return head + b''.join(parts)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   170
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   171
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   172
if _IS_PY3:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   173
    def dumps_dict(d, sort_keys=False):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   174
        head = _encode_type_num(CBOR_MAP, len(d))
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   175
        parts = [head]
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   176
        if sort_keys:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   177
            for k in sorted(d.keys()):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   178
                v = d[k]
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   179
                parts.append(dumps(k, sort_keys=sort_keys))
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   180
                parts.append(dumps(v, sort_keys=sort_keys))
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   181
        else:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   182
            for k,v in d.items():
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   183
                parts.append(dumps(k, sort_keys=sort_keys))
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   184
                parts.append(dumps(v, sort_keys=sort_keys))
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   185
        return b''.join(parts)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   186
else:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   187
    def dumps_dict(d, sort_keys=False):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   188
        head = _encode_type_num(CBOR_MAP, len(d))
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   189
        parts = [head]
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   190
        if sort_keys:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   191
            for k in sorted(d.iterkeys()):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   192
                v = d[k]
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   193
                parts.append(dumps(k, sort_keys=sort_keys))
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   194
                parts.append(dumps(v, sort_keys=sort_keys))
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   195
        else:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   196
            for k,v in d.iteritems():
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   197
                parts.append(dumps(k, sort_keys=sort_keys))
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   198
                parts.append(dumps(v, sort_keys=sort_keys))
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   199
        return b''.join(parts)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   200
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   201
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   202
def dumps_bool(b):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   203
    if b:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   204
        return struct.pack('B', CBOR_TRUE)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   205
    return struct.pack('B', CBOR_FALSE)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   206
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   207
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   208
def dumps_tag(t, sort_keys=False):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   209
    return _encode_type_num(CBOR_TAG, t.tag) + dumps(t.value, sort_keys=sort_keys)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   210
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   211
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   212
if _IS_PY3:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   213
    def _is_stringish(x):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   214
        return isinstance(x, (str, bytes))
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   215
    def _is_intish(x):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   216
        return isinstance(x, int)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   217
else:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   218
    def _is_stringish(x):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   219
        return isinstance(x, (str, basestring, bytes, unicode))
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   220
    def _is_intish(x):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   221
        return isinstance(x, (int, long))
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   222
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   223
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   224
def dumps(ob, sort_keys=False):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   225
    if ob is None:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   226
        return struct.pack('B', CBOR_NULL)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   227
    if isinstance(ob, bool):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   228
        return dumps_bool(ob)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   229
    if _is_stringish(ob):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   230
        return dumps_string(ob)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   231
    if isinstance(ob, (list, tuple)):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   232
        return dumps_array(ob, sort_keys=sort_keys)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   233
    # TODO: accept other enumerables and emit a variable length array
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   234
    if isinstance(ob, dict):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   235
        return dumps_dict(ob, sort_keys=sort_keys)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   236
    if isinstance(ob, float):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   237
        return dumps_float(ob)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   238
    if _is_intish(ob):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   239
        return dumps_int(ob)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   240
    if isinstance(ob, Tag):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   241
        return dumps_tag(ob, sort_keys=sort_keys)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   242
    raise Exception("don't know how to cbor serialize object of type %s", type(ob))
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   243
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   244
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   245
# same basic signature as json.dump, but with no options (yet)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   246
def dump(obj, fp, sort_keys=False):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   247
    """
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   248
    obj: Python object to serialize
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   249
    fp: file-like object capable of .write(bytes)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   250
    """
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   251
    # this is kinda lame, but probably not inefficient for non-huge objects
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   252
    # TODO: .write() to fp as we go as each inner object is serialized
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   253
    blob = dumps(obj, sort_keys=sort_keys)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   254
    fp.write(blob)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   255
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   256
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   257
class Tag(object):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   258
    def __init__(self, tag=None, value=None):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   259
        self.tag = tag
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   260
        self.value = value
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   261
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   262
    def __repr__(self):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   263
        return "Tag({0!r}, {1!r})".format(self.tag, self.value)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   264
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   265
    def __eq__(self, other):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   266
        if not isinstance(other, Tag):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   267
            return False
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   268
        return (self.tag == other.tag) and (self.value == other.value)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   269
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   270
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   271
def loads(data):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   272
    """
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   273
    Parse CBOR bytes and return Python objects.
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   274
    """
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   275
    if data is None:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   276
        raise ValueError("got None for buffer to decode in loads")
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   277
    fp = StringIO(data)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   278
    return _loads(fp)[0]
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   279
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   280
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   281
def load(fp):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   282
    """
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   283
    Parse and return object from fp, a file-like object supporting .read(n)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   284
    """
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   285
    return _loads(fp)[0]
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   286
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   287
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   288
_MAX_DEPTH = 100
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   289
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   290
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   291
def _tag_aux(fp, tb):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   292
    bytes_read = 1
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   293
    tag = tb & CBOR_TYPE_MASK
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   294
    tag_aux = tb & CBOR_INFO_BITS
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   295
    if tag_aux <= 23:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   296
        aux = tag_aux
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   297
    elif tag_aux == CBOR_UINT8_FOLLOWS:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   298
        data = fp.read(1)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   299
        aux = struct.unpack_from("!B", data, 0)[0]
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   300
        bytes_read += 1
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   301
    elif tag_aux == CBOR_UINT16_FOLLOWS:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   302
        data = fp.read(2)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   303
        aux = struct.unpack_from("!H", data, 0)[0]
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   304
        bytes_read += 2
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   305
    elif tag_aux == CBOR_UINT32_FOLLOWS:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   306
        data = fp.read(4)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   307
        aux = struct.unpack_from("!I", data, 0)[0]
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   308
        bytes_read += 4
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   309
    elif tag_aux == CBOR_UINT64_FOLLOWS:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   310
        data = fp.read(8)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   311
        aux = struct.unpack_from("!Q", data, 0)[0]
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   312
        bytes_read += 8
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   313
    else:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   314
        assert tag_aux == CBOR_VAR_FOLLOWS, "bogus tag {0:02x}".format(tb)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   315
        aux = None
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   316
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   317
    return tag, tag_aux, aux, bytes_read
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   318
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   319
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   320
def _read_byte(fp):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   321
    tb = fp.read(1)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   322
    if len(tb) == 0:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   323
        # I guess not all file-like objects do this
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   324
        raise EOFError()
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   325
    return ord(tb)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   326
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   327
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   328
def _loads_var_array(fp, limit, depth, returntags, bytes_read):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   329
    ob = []
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   330
    tb = _read_byte(fp)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   331
    while tb != CBOR_BREAK:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   332
        (subob, sub_len) = _loads_tb(fp, tb, limit, depth, returntags)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   333
        bytes_read += 1 + sub_len
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   334
        ob.append(subob)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   335
        tb = _read_byte(fp)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   336
    return (ob, bytes_read + 1)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   337
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   338
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   339
def _loads_var_map(fp, limit, depth, returntags, bytes_read):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   340
    ob = {}
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   341
    tb = _read_byte(fp)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   342
    while tb != CBOR_BREAK:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   343
        (subk, sub_len) = _loads_tb(fp, tb, limit, depth, returntags)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   344
        bytes_read += 1 + sub_len
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   345
        (subv, sub_len) = _loads(fp, limit, depth, returntags)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   346
        bytes_read += sub_len
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   347
        ob[subk] = subv
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   348
        tb = _read_byte(fp)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   349
    return (ob, bytes_read + 1)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   350
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   351
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   352
if _IS_PY3:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   353
    def _loads_array(fp, limit, depth, returntags, aux, bytes_read):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   354
        ob = []
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   355
        for i in range(aux):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   356
            subob, subpos = _loads(fp)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   357
            bytes_read += subpos
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   358
            ob.append(subob)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   359
        return ob, bytes_read
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   360
    def _loads_map(fp, limit, depth, returntags, aux, bytes_read):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   361
        ob = {}
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   362
        for i in range(aux):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   363
            subk, subpos = _loads(fp)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   364
            bytes_read += subpos
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   365
            subv, subpos = _loads(fp)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   366
            bytes_read += subpos
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   367
            ob[subk] = subv
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   368
        return ob, bytes_read
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   369
else:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   370
    def _loads_array(fp, limit, depth, returntags, aux, bytes_read):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   371
        ob = []
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   372
        for i in xrange(aux):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   373
            subob, subpos = _loads(fp)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   374
            bytes_read += subpos
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   375
            ob.append(subob)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   376
        return ob, bytes_read
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   377
    def _loads_map(fp, limit, depth, returntags, aux, bytes_read):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   378
        ob = {}
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   379
        for i in xrange(aux):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   380
            subk, subpos = _loads(fp)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   381
            bytes_read += subpos
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   382
            subv, subpos = _loads(fp)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   383
            bytes_read += subpos
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   384
            ob[subk] = subv
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   385
        return ob, bytes_read
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   386
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   387
def _loads(fp, limit=None, depth=0, returntags=False):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   388
    "return (object, bytes read)"
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   389
    if depth > _MAX_DEPTH:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   390
        raise Exception("hit CBOR loads recursion depth limit")
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   391
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   392
    tb = _read_byte(fp)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   393
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   394
    return _loads_tb(fp, tb, limit, depth, returntags)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   395
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   396
def _loads_tb(fp, tb, limit=None, depth=0, returntags=False):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   397
    # Some special cases of CBOR_7 best handled by special struct.unpack logic here
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   398
    if tb == CBOR_FLOAT16:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   399
        data = fp.read(2)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   400
        hibyte, lowbyte = struct.unpack_from("BB", data, 0)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   401
        exp = (hibyte >> 2) & 0x1F
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   402
        mant = ((hibyte & 0x03) << 8) | lowbyte
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   403
        if exp == 0:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   404
            val = mant * (2.0 ** -24)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   405
        elif exp == 31:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   406
            if mant == 0:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   407
                val = float('Inf')
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   408
            else:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   409
                val = float('NaN')
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   410
        else:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   411
            val = (mant + 1024.0) * (2 ** (exp - 25))
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   412
        if hibyte & 0x80:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   413
            val = -1.0 * val
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   414
        return (val, 3)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   415
    elif tb == CBOR_FLOAT32:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   416
        data = fp.read(4)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   417
        pf = struct.unpack_from("!f", data, 0)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   418
        return (pf[0], 5)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   419
    elif tb == CBOR_FLOAT64:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   420
        data = fp.read(8)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   421
        pf = struct.unpack_from("!d", data, 0)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   422
        return (pf[0], 9)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   423
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   424
    tag, tag_aux, aux, bytes_read = _tag_aux(fp, tb)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   425
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   426
    if tag == CBOR_UINT:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   427
        return (aux, bytes_read)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   428
    elif tag == CBOR_NEGINT:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   429
        return (-1 - aux, bytes_read)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   430
    elif tag == CBOR_BYTES:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   431
        ob, subpos = loads_bytes(fp, aux)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   432
        return (ob, bytes_read + subpos)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   433
    elif tag == CBOR_TEXT:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   434
        raw, subpos = loads_bytes(fp, aux, btag=CBOR_TEXT)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   435
        ob = raw.decode('utf8')
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   436
        return (ob, bytes_read + subpos)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   437
    elif tag == CBOR_ARRAY:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   438
        if aux is None:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   439
            return _loads_var_array(fp, limit, depth, returntags, bytes_read)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   440
        return _loads_array(fp, limit, depth, returntags, aux, bytes_read)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   441
    elif tag == CBOR_MAP:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   442
        if aux is None:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   443
            return _loads_var_map(fp, limit, depth, returntags, bytes_read)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   444
        return _loads_map(fp, limit, depth, returntags, aux, bytes_read)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   445
    elif tag == CBOR_TAG:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   446
        ob, subpos = _loads(fp)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   447
        bytes_read += subpos
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   448
        if returntags:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   449
            # Don't interpret the tag, return it and the tagged object.
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   450
            ob = Tag(aux, ob)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   451
        else:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   452
            # attempt to interpet the tag and the value into a Python object.
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   453
            ob = tagify(ob, aux)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   454
        return ob, bytes_read
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   455
    elif tag == CBOR_7:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   456
        if tb == CBOR_TRUE:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   457
            return (True, bytes_read)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   458
        if tb == CBOR_FALSE:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   459
            return (False, bytes_read)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   460
        if tb == CBOR_NULL:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   461
            return (None, bytes_read)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   462
        if tb == CBOR_UNDEFINED:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   463
            return (None, bytes_read)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   464
        raise ValueError("unknown cbor tag 7 byte: {:02x}".format(tb))
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   465
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   466
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   467
def loads_bytes(fp, aux, btag=CBOR_BYTES):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   468
    # TODO: limit to some maximum number of chunks and some maximum total bytes
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   469
    if aux is not None:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   470
        # simple case
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   471
        ob = fp.read(aux)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   472
        return (ob, aux)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   473
    # read chunks of bytes
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   474
    chunklist = []
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   475
    total_bytes_read = 0
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   476
    while True:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   477
        tb = fp.read(1)[0]
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   478
        if not _IS_PY3:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   479
            tb = ord(tb)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   480
        if tb == CBOR_BREAK:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   481
            total_bytes_read += 1
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   482
            break
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   483
        tag, tag_aux, aux, bytes_read = _tag_aux(fp, tb)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   484
        assert tag == btag, 'variable length value contains unexpected component'
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   485
        ob = fp.read(aux)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   486
        chunklist.append(ob)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   487
        total_bytes_read += bytes_read + aux
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   488
    return (b''.join(chunklist), total_bytes_read)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   489
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   490
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   491
if _IS_PY3:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   492
    def _bytes_to_biguint(bs):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   493
        out = 0
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   494
        for ch in bs:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   495
            out = out << 8
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   496
            out = out | ch
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   497
        return out
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   498
else:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   499
    def _bytes_to_biguint(bs):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   500
        out = 0
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   501
        for ch in bs:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   502
            out = out << 8
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   503
            out = out | ord(ch)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   504
        return out
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   505
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   506
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   507
def tagify(ob, aux):
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   508
    # TODO: make this extensible?
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   509
    # cbor.register_tag_handler(tagnumber, tag_handler)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   510
    # where tag_handler takes (tagnumber, tagged_object)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   511
    if aux == CBOR_TAG_DATE_STRING:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   512
        # TODO: parse RFC3339 date string
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   513
        pass
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   514
    if aux == CBOR_TAG_DATE_ARRAY:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   515
        return datetime.datetime.utcfromtimestamp(ob)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   516
    if aux == CBOR_TAG_BIGNUM:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   517
        return _bytes_to_biguint(ob)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   518
    if aux == CBOR_TAG_NEGBIGNUM:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   519
        return -1 - _bytes_to_biguint(ob)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   520
    if aux == CBOR_TAG_REGEX:
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   521
        # Is this actually a good idea? Should we just return the tag and the raw value to the user somehow?
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   522
        return re.compile(ob)
b3dbba6e34c9 evolve: start vendoring third party package cbor
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   523
    return Tag(aux, ob)