Example #1
0
def test_extension_add_remove():

    # Not specifying extensions used defaults
    x = bsdf.BsdfSerializer()
    assert len(x._extensions) > 0
    x = bsdf.BsdfSerializer(None)
    assert len(x._extensions) > 0

    # Specifying empty list discarts defaults
    x = bsdf.BsdfSerializer([])
    assert len(x._extensions) == 0

    class MyExtension(bsdf.Extension):
        name = 'x'

    # Add via init or add_extensions()
    x = bsdf.BsdfSerializer([MyExtension])
    assert len(x._extensions) == 1
    x.add_extension(bsdf.ComplexExtension)
    assert len(x._extensions) == 2

    # No dups
    x.add_extension(MyExtension)
    x.add_extension(bsdf.ComplexExtension)

    # Remove
    with raises(TypeError):
        x.remove_extension(bsdf.ComplexExtension)
    x.remove_extension('x')
    x.remove_extension('c')
    assert len(x._extensions) == 0
Example #2
0
def test_options():

    s = bsdf.BsdfSerializer(compression='zlib')
    assert s._compression == 1
    s = bsdf.BsdfSerializer(compression='bz2')
    assert s._compression == 2
    with raises(TypeError):
        bsdf.BsdfSerializer(compression='zzlib')
    with raises(TypeError):
        bsdf.BsdfSerializer(compression=9)
Example #3
0
def test_loaders_and_savers_of_serializer():

    s1 = dict(foo=42, bar=[1, 2.1, False, 'spam', b'eggs'])

    serializer = bsdf.BsdfSerializer()

    # In-memory
    bb = serializer.encode(s1)
    s2 = serializer.decode(bb)
    assert s1 == s2

    # Using a filename fails
    with raises(AttributeError):
        serializer.save(tempfilename, s1)
    with raises(AttributeError):
        s2 = serializer.load(tempfilename)

    # Using a file object
    with open(tempfilename, 'wb') as f:
        serializer.save(f, s1)
    with open(tempfilename, 'rb') as f:
        s2 = serializer.load(f)
    assert s1 == s2

    # Using a very strict file object
    with open(tempfilename, 'wb') as f:
        serializer.save(StrictWriteFile(f), s1)
    with open(tempfilename, 'rb') as f:
        s2 = serializer.load(StrictReadFile(f))
    assert s1 == s2
Example #4
0
def test_standard_extensions_complex():

    x = bsdf.BsdfSerializer()

    a = 3 + 4j
    bb = x.encode(a)
    b = x.decode(bb)
    assert a == b
Example #5
0
def test_autoconvert_numpy_scalars():

    try:
        import numpy as np
    except ImportError:
        skip('need numpy')

    serializer = bsdf.BsdfSerializer([])

    # Reference
    r1 = [2, -2, 4, -4, 8, -8]
    r2 = [2.0, 4.0, 8.0]

    # Same data, as numpy scalars
    a1 = [
        np.uint16(2),
        np.int16(-2),
        np.uint32(4),
        np.int32(-4),
        np.uint64(8),
        np.int64(-8)
    ]
    a2 = [np.float16(2.0), np.float32(4.0), np.float64(8.0)]

    assert a1 == r1
    assert a2 == r2

    # Encode
    b1 = serializer.encode(a1)
    b2 = serializer.encode(a2)

    assert b1 == serializer.encode(r1)
    assert b2 == serializer.encode(r2)

    # Decode
    c1 = serializer.decode(b1)
    c2 = serializer.decode(b2)

    assert c1 == r1
    assert c2 == r2

    assert not any([isinstance(x, int) for x in a1])
    assert not all([isinstance(x, float)
                    for x in a2])  # bc True for np.float64
    assert all([isinstance(x, int) for x in c1])
    assert all([isinstance(x, float) for x in c2])
Example #6
0
Note that JSON is partly implemented in C from Python 3.x, giving it a
significant performance advantage. One can expect an equally large performance
boost if BSDF is ever implemented in C. For now, let's try to get it more or
less in the same order of magnitude.
"""

import os
import sys
import json
from time import perf_counter, sleep
#from time import time as perf_counter  # py27


# === BSDF
import bsdf
lib = bsdf.BsdfSerializer()
lib.dumps = lib.encode
lib.loads = lib.decode

# === YAML
# import yaml as lib
# import io
# lib.loads = lambda bb: lib.load(io.StringIO(bb))
# lib.dumps = lib.dump

# === msgpack
# # os.environ['MSGPACK_PUREPYTHON'] = '1'
# import msgpack as lib
# lib.dumps = lib.packb
# lib.loads = lib.unpackb