diff --git a/influxdb/client.py b/influxdb/client.py index 0d948dd3..5116befc 100755 --- a/influxdb/client.py +++ b/influxdb/client.py @@ -363,13 +363,13 @@ def get_list_series(self, database=None): rsp = self.query("SHOW SERIES", database=database) print "RSP", rsp.raw print "RSP", rsp['results'] - return rsp + return list(rsp) def get_list_users(self): """ Get the list of users """ - return self.query("SHOW USERS") + return list(self.query("SHOW USERS")) def delete_series(self, name, database=None): database = database or self._database diff --git a/influxdb/point.py b/influxdb/point.py deleted file mode 100644 index 90aac7d4..00000000 --- a/influxdb/point.py +++ /dev/null @@ -1,77 +0,0 @@ -# -*- coding: utf-8 -*- - - -# could it be a namedtuple .. ?? -class NamedValues(object): - - def __init__(self, point): - self._point = point - - def __getattr__(self, item): - try: - index = self._point.columns.index(item) - except ValueError: - raise AttributeError('Point have no such attribute (%r)' % item) - return self._point._point_values[index] - - def __repr__(self): - return 'Values(%s)' % ', '.join( - '%s=%r' % (k, self._point._point_values[k]) - for k in self._point.columns) - - -class Point(object): - - def __init__(self, serie, columns, values, tags=None): - """ - - :param serie: The name of the serie in which this point resides. - If None then it's a "system" point/result. - :param columns: The ordered list of the columns. - :param values: The actualy list of values of this point. Same order than columns. - :param tags: The eventual tags (dict) associated with the point. - :return: - """ - assert len(columns) == len(values) - self.columns = columns - self._point_values = values - if tags is None: - tags = {} - self.serie = serie - self.tags = tags - self.values = NamedValues(self) - - def __getitem__(self, tag_name): - """Indexing a Point return the tag value associated with - the given tag name, if it exists""" - return self._tags[tag_name] - - def __iter__(self): - """Iterating over a Point will return its eventual tag names one per one""" - return iter(self._tags) - - def __len__(self): - """The len of a Point is its number of columns/values""" - return len(self.columns) - - def __repr__(self): - return 'Point(values=(%s), tags=%s)' % ( - ', '.join('%s=%r' % ( - k, getattr(self.values, k)) for k in self.columns), - self.tags) - - def __eq__(self, other): - return (isinstance(other, self.__class__) - and self.tags == other.tags - and self._point_values == other._point_values - and self.serie == other.serie - and self.columns == other.columns) - - def __ne__(self, other): - return not self.__eq__(other) - - def as_dict(self): - return { - "serie": self.serie, - "point": [{col: getattr(self.values, col)} for col in self.columns] - } diff --git a/influxdb/resultset.py b/influxdb/resultset.py index e3e3d37c..0d8ce1c3 100644 --- a/influxdb/resultset.py +++ b/influxdb/resultset.py @@ -1,7 +1,5 @@ # -*- coding: utf-8 -*- -from influxdb.point import Point - _sentinel = object() @@ -43,7 +41,7 @@ def __getitem__(self, key): # like 'show retention policies' .. if key is None: for point in serie['values']: - yield Point(None, serie['columns'], point) + yield self.point_from_cols_vals(serie['columns'], point) elif name in (None, serie_name): # by default if no tags was provided then @@ -51,7 +49,7 @@ def __getitem__(self, key): serie_tags = serie.get('tags', {}) if tags is None or self._tag_matches(serie_tags, tags): for point in serie['values']: - yield Point(serie_name, serie['columns'], point, serie_tags) + yield self.point_from_cols_vals(serie['columns'], point) def __repr__(self): return str(self.raw) @@ -91,14 +89,21 @@ def __len__(self): def keys(self): keys = [] for serie in self._get_series(): - keys.append((serie['name'], serie['tags'])) + keys.append((serie.get('name', None), serie.get('tags', None))) return keys def items(self): items = [] for serie in self._get_series(): - serie_key = (serie['name'], serie['tags']) + serie_key = (serie.get('name', None), serie.get('tags', None)) items.append( - (serie_key, self.__getitem__(serie_key)) + (serie_key, self[serie_key]) ) - return items \ No newline at end of file + return items + + @staticmethod + def point_from_cols_vals(cols, vals): + point = {} + for col_index, col_name in enumerate(cols): + point[col_name] = vals[col_index] + return point diff --git a/tests/influxdb/client_test.py b/tests/influxdb/client_test.py index 1ea2e06e..1cc773ce 100644 --- a/tests/influxdb/client_test.py +++ b/tests/influxdb/client_test.py @@ -266,12 +266,13 @@ def test_query(self): "http://localhost:8086/query", text=example_response ) - self.assertDictEqual( - self.cli.query('select * from foo'), - {'cpu_load_short': + rs = self.cli.query('select * from foo') + self.assertListEqual( + list(rs), + [{'cpu_load_short': [{'value': 0.64, 'time': '2009-11-10T23:00:00Z'}], 'sdfsdfsdf': - [{'value': 0.64, 'time': '2009-11-10T23:00:00Z'}]} + [{'value': 0.64, 'time': '2009-11-10T23:00:00Z'}]}] ) @unittest.skip('Not implemented for 0.9') diff --git a/tests/influxdb/client_test_with_server.py b/tests/influxdb/client_test_with_server.py index a54a3125..0961455f 100644 --- a/tests/influxdb/client_test_with_server.py +++ b/tests/influxdb/client_test_with_server.py @@ -287,9 +287,8 @@ def test_fresh_server_no_db(self): def test_create_database(self): self.assertIsNone(self.cli.create_database('new_db_1')) self.assertIsNone(self.cli.create_database('new_db_2')) - rsp = self.cli.get_list_database() self.assertEqual( - rsp, + self.cli.get_list_database(), ['new_db_1', 'new_db_2'] ) @@ -522,30 +521,34 @@ def test_get_list_series_empty(self): def test_get_list_series_non_empty(self): self.cli.write_points(dummy_point) rsp = self.cli.get_list_series() - self.assertEqual( - {'cpu_load_short': [ - {'region': 'us-west', 'host': 'server01', '_id': 1}]}, - rsp - ) + self.assertEqual([ + { + 'serie_name': 'cpu_load_short', + '_id': 1, + "tags": { + "host": "server01", + "region": "us-west" + } + }], + rsp) def test_default_retention_policy(self): rsp = self.cli.get_list_retention_policies() self.assertEqual( [ - {'duration': '0', 'default': True, - 'replicaN': 1, 'name': 'default'}], + {'name': 'default', 'duration': '0', 'replicaN': 1, 'default': True} + ], rsp ) def test_create_retention_policy_default(self): - rsp = self.cli.create_retention_policy('somename', '1d', 4, - default=True) - self.assertIsNone(rsp) + self.cli.create_retention_policy('somename', '1d', 4, default=True) + self.cli.create_retention_policy('another', '2d', 3, default=False) rsp = self.cli.get_list_retention_policies() self.assertEqual([ - {'columns': ['name', 'duration', 'replicaN', 'default'], - 'values': [['default', '0', 1, False], - ['somename', '24h0m0s', 4, True]]}], + {'name': 'somename', 'duration': '1d', 'replicaN': 4, 'default': True}, + {'name': 'another', 'duration': '2d', 'replicaN': 3, 'default': False} + ], rsp ) @@ -554,10 +557,7 @@ def test_create_retention_policy(self): rsp = self.cli.get_list_retention_policies() self.assertEqual( [ - {'duration': '0', 'default': True, 'replicaN': 1, - 'name': 'default'}, - {'duration': '24h0m0s', 'default': False, 'replicaN': 4, - 'name': 'somename'} + {'name': 'somename', 'duration': '1d', 'replicaN': 4, 'default': False}, ], rsp ) @@ -702,7 +702,7 @@ def test_query_multiple_series(self): ] self.cli.write_points(pts) - rsp = self.cli.query('SELECT * FROM serie1, serie2') + rsp = self.cli.query('SELECT * FROM serie1; SELECT * FROM serie2') print(rsp) # same but with the tags given : diff --git a/tests/influxdb/point_test.py b/tests/influxdb/point_test.py deleted file mode 100644 index 96ffb9da..00000000 --- a/tests/influxdb/point_test.py +++ /dev/null @@ -1,44 +0,0 @@ -# -*- coding: utf-8 -*- - -import unittest - -from influxdb.point import Point - - -class TestPoint(unittest.TestCase): - def setUp(self): - self.point = Point( - "serie_name", - ['col1', 'col2'], - [1, '2'], - tags={ - "SWAG": True, - "ALLO": "BYE" - } - ) - - def test_point(self): - self.assertEqual(self.point.columns, ['col1', 'col2']) - self.assertEqual(self.point.tags, {"SWAG": True, "ALLO": "BYE"}) - self.assertEqual(self.point.values.col1, 1) - self.assertEqual(self.point.values.col2, '2') - self.assertEqual( - str(self.point), - "Point(values=(col1=1, col2='2')," - " tags={'ALLO': 'BYE', 'SWAG': True})" - ) - - def test_point_eq(self): - point1 = Point("serie_name", ['col1', 'col2'], [1, '2'], - tags={"SWAG": True, "ALLO": "BYE"}) - - point2 = Point("serie_name", ['col1', 'col2'], [1, '2'], - tags={"SWAG": True, "ALLO": "BYE"}) - - self.assertEqual(point1, point2) - - def test_as_dict(self): - self.assertEqual( - self.point.as_dict(), - {'point': [{'col1': 1}, {'col2': '2'}], 'serie': 'serie_name'} - ) diff --git a/tests/influxdb/resultset_test.py b/tests/influxdb/resultset_test.py index 0a727e8d..00872f15 100644 --- a/tests/influxdb/resultset_test.py +++ b/tests/influxdb/resultset_test.py @@ -3,7 +3,6 @@ import unittest from influxdb.resultset import ResultSet -from influxdb.point import Point class TestResultSet(unittest.TestCase): @@ -40,36 +39,22 @@ def test_filter_by_name(self): self.assertEqual( list(self.rs['cpu_load_short']), [ - Point("cpu_load_short", ["time", "value"], - ["2015-01-29T21:51:28.968422294Z", 0.64], - tags={"host": "server01", "region": "us-west"}), - Point("cpu_load_short", ["time", "value"], - ["2015-01-29T21:51:28.968422294Z", 0.64], - tags={"host": "server02", "region": "us-west"}) + {'value': 0.64, 'time': '2015-01-29T21:51:28.968422294Z'}, + {'value': 0.64, 'time': '2015-01-29T21:51:28.968422294Z'} ] ) def test_filter_by_tags(self): self.assertEqual( list(self.rs[('cpu_load_short', {"host": "server01"})]), - [ - Point( - "cpu_load_short", ["time", "value"], - ["2015-01-29T21:51:28.968422294Z", 0.64], - tags={"host": "server01", "region": "us-west"} - ) - ] + [{'time': '2015-01-29T21:51:28.968422294Z', 'value': 0.64}] ) self.assertEqual( list(self.rs[('cpu_load_short', {"region": "us-west"})]), [ - Point("cpu_load_short", ["time", "value"], - ["2015-01-29T21:51:28.968422294Z", 0.64], - tags={"host": "server01", "region": "us-west"}), - Point("cpu_load_short", ["time", "value"], - ["2015-01-29T21:51:28.968422294Z", 0.64], - tags={"host": "server02", "region": "us-west"}), + {'value': 0.64, 'time': '2015-01-29T21:51:28.968422294Z'}, + {'value': 0.64, 'time': '2015-01-29T21:51:28.968422294Z'} ] ) @@ -98,21 +83,25 @@ def test_items(self): [ ( ('cpu_load_short', {'host': 'server01', 'region': 'us-west'}), - [Point("cpu_load_short", ["time", "value"], - ["2015-01-29T21:51:28.968422294Z", 0.64], - tags={"host": "server01", "region": "us-west"})] + [{'value': 0.64, 'time': '2015-01-29T21:51:28.968422294Z'}] ), ( ('cpu_load_short', {'host': 'server02', 'region': 'us-west'}), - [Point("cpu_load_short", ["time", "value"], - ["2015-01-29T21:51:28.968422294Z", 0.64], - tags={"host": "server02", "region": "us-west"})] + [{'value': 0.64, 'time': '2015-01-29T21:51:28.968422294Z'}] ), ( ('other_serie', {'host': 'server01', 'region': 'us-west'}), - [Point("other_serie", ["time", "value"], - ["2015-01-29T21:51:28.968422294Z", 0.64], - tags={"host": "server01", "region": "us-west"})] + [{'value': 0.64, 'time': '2015-01-29T21:51:28.968422294Z'}] ) ] ) + + def test_point_from_cols_vals(self): + cols = ['col1', 'col2'] + vals = [1, '2'] + + point = ResultSet.point_from_cols_vals(cols, vals) + self.assertDictEqual( + point, + {'col1': 1, 'col2': '2'} + )