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
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)
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
def test_standard_extensions_complex(): x = bsdf.BsdfSerializer() a = 3 + 4j bb = x.encode(a) b = x.decode(bb) assert a == b
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])
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