# -*- coding: utf-8 -*- import nilmdb.server import nilmdb.client import nilmdb.client.numpyclient from nilmdb.utils.printf import * from nilmdb.utils import timestamper from nilmdb.client import ClientError, ServerError from nilmdb.utils import datetime_tz from nose.plugins.skip import SkipTest from nose.tools import * from nose.tools import assert_raises import itertools import distutils.version from testutil.helpers import * import numpy as np testdb = "tests/numpyclient-testdb" testurl = "http://localhost:32180/" def setup_module(): global test_server, test_db # Clear out DB recursive_unlink(testdb) # Start web app on a custom port test_db = nilmdb.utils.serializer_proxy(nilmdb.server.NilmDB)(testdb) test_server = nilmdb.server.Server(test_db, host = "127.0.0.1", port = 32180, stoppable = False, fast_shutdown = True, force_traceback = True) test_server.start(blocking = False) def teardown_module(): global test_server, test_db # Close web app test_server.stop() test_db.close() class TestNumpyClient(object): def test_numpyclient_01_basic(self): # Test basic connection client = nilmdb.client.numpyclient.NumpyClient(url = testurl) version = client.version() eq_(distutils.version.LooseVersion(version), distutils.version.LooseVersion(test_server.version)) # Verify subclassing assert(isinstance(client, nilmdb.client.Client)) # Layouts for layout in "int8_t", "something_8", "integer_1": with assert_raises(ValueError): for x in client.stream_extract_numpy("/foo", layout=layout): pass for layout in "int8_1", "uint8_30", "int16_20", "float64_100": with assert_raises(ClientError) as e: for x in client.stream_extract_numpy("/foo", layout=layout): pass in_("No such stream", str(e.exception)) with assert_raises(ClientError) as e: for x in client.stream_extract_numpy("/foo"): pass in_("can't get layout for path", str(e.exception)) client.close() def test_numpyclient_02_extract(self): client = nilmdb.client.numpyclient.NumpyClient(url = testurl) # Insert some data as text client.stream_create("/newton/prep", "float32_8") testfile = "tests/data/prep-20120323T1000" start = nilmdb.utils.time.parse_time("20120323T1000") rate = 120 data = timestamper.TimestamperRate(testfile, start, rate) result = client.stream_insert("/newton/prep", data, start, start + 119999777) # Extract Numpy arrays array = None pieces = 0 for chunk in client.stream_extract_numpy("/newton/prep", maxrows=1000): pieces += 1 if array is not None: array = np.vstack((array, chunk)) else: array = chunk eq_(array.shape, (14400, 9)) eq_(pieces, 15) # Try structured s = list(client.stream_extract_numpy("/newton/prep", structured = True)) assert(np.array_equal(np.c_[s[0]['timestamp'], s[0]['data']], array)) # Compare. Will be close but not exact because the conversion # to and from ASCII was lossy. data = timestamper.TimestamperRate(testfile, start, rate) actual = np.fromstring(" ".join(data), sep=' ').reshape(14400, 9) assert(np.allclose(array, actual)) client.close()