hgext3rd/evolve/thirdparty/cbor.py
author Martin von Zweigbergk <martinvonz@google.com>
Wed, 03 Jul 2019 11:13:47 -0700
changeset 4714 c51fc0ae7a7e
parent 3390 b3dbba6e34c9
child 4814 48b30ff742cb
permissions -rw-r--r--
py3: switch from iteritems() to items()
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:
4714
c51fc0ae7a7e py3: switch from iteritems() to items()
Martin von Zweigbergk <martinvonz@google.com>
parents: 3390
diff changeset
   196
            for k,v in d.items():
3390
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)