Skip to content

Commit 0224ad7

Browse files
authored
feat: WriteApi supports Iterable type (#152)
1 parent bf455d1 commit 0224ad7

File tree

4 files changed

+62
-8
lines changed

4 files changed

+62
-8
lines changed

CHANGELOG.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
## 1.11.0 [unreleased]
22

3+
### Features
4+
1. [#152](https://github.com/influxdata/influxdb-client-python/pull/152): WriteApi supports generic Iterable type
5+
36
### API
4-
1. [#151](https://github.com/influxdata/influxdb-client-python/pull/151): Default port changed from 9999 -> 8086
7+
1. [#151](https://github.com/influxdata/influxdb-client-python/pull/151): Default port changed from 9999 -> 8086
58

69
## 1.10.0 [2020-08-14]
710

influxdb_client/client/write_api.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from enum import Enum
99
from random import random
1010
from time import sleep
11-
from typing import Union, List, Any
11+
from typing import Union, Any, Iterable
1212

1313
import rx
1414
from rx import operators as ops, Observable
@@ -212,7 +212,8 @@ def __init__(self, influxdb_client, write_options: WriteOptions = WriteOptions()
212212

213213
def write(self, bucket: str, org: str = None,
214214
record: Union[
215-
str, List['str'], Point, List['Point'], dict, List['dict'], bytes, List['bytes'], Observable] = None,
215+
str, Iterable['str'], Point, Iterable['Point'], dict, Iterable['dict'], bytes, Iterable['bytes'],
216+
Observable] = None,
216217
write_precision: WritePrecision = DEFAULT_WRITE_PRECISION, **kwargs) -> Any:
217218
"""
218219
Write time-series data into InfluxDB.
@@ -291,7 +292,7 @@ def _serialize(self, record, write_precision, payload, **kwargs):
291292
_data = data_frame_to_list_of_points(record, self._point_settings, **kwargs)
292293
self._serialize(_data, write_precision, payload, **kwargs)
293294

294-
elif isinstance(record, list):
295+
elif isinstance(record, Iterable):
295296
for item in record:
296297
self._serialize(item, write_precision, payload, **kwargs)
297298

@@ -317,7 +318,7 @@ def _write_batching(self, bucket, org, data,
317318
self._write_batching(bucket, org, data_frame_to_list_of_points(data, self._point_settings, **kwargs),
318319
precision, **kwargs)
319320

320-
elif isinstance(data, list):
321+
elif isinstance(data, Iterable):
321322
for item in data:
322323
self._write_batching(bucket, org, item, precision, **kwargs)
323324

@@ -328,11 +329,13 @@ def _write_batching(self, bucket, org, data,
328329
return None
329330

330331
def _append_default_tag(self, key, val, record):
331-
if isinstance(record, Point):
332+
if isinstance(record, bytes) or isinstance(record, str):
333+
pass
334+
elif isinstance(record, Point):
332335
record.tag(key, val)
333336
elif isinstance(record, dict):
334337
record.get("tags")[key] = val
335-
elif isinstance(record, list):
338+
elif isinstance(record, Iterable):
336339
for item in record:
337340
self._append_default_tag(key, val, item)
338341

tests/test_WriteApi.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,47 @@ def test_write_bytes(self):
227227

228228
self.delete_test_bucket(_bucket)
229229

230+
def test_write_tuple(self):
231+
bucket = self.create_test_bucket()
232+
233+
_record1 = "h2o_feet,location=coyote_creek level\\ water_level=1.0 1"
234+
_record2 = "h2o_feet,location=coyote_creek level\\ water_level=2.0 2"
235+
_bytes = "h2o_feet,location=coyote_creek level\\ water_level=3.0 3".encode("utf-8")
236+
237+
p = (Point("h2o_feet").tag("location", "coyote_creek").field("level water_level", 4.0).time(4))
238+
239+
tuple = (_record1, _record2, _bytes, (p, ))
240+
241+
self.write_client = self.client.write_api(write_options=SYNCHRONOUS)
242+
self.write_client.write(bucket.name, self.org, tuple)
243+
244+
query = f'from(bucket:"{bucket.name}") |> range(start: 1970-01-01T00:00:00.000000001Z)'
245+
246+
flux_result = self.client.query_api().query(query)
247+
248+
self.assertEqual(1, len(flux_result))
249+
250+
records = flux_result[0].records
251+
252+
self.assertEqual(4, len(records))
253+
254+
self.assertEqual("h2o_feet", records[0].get_measurement())
255+
self.assertEqual(1, records[0].get_value())
256+
self.assertEqual("level water_level", records[0].get_field())
257+
258+
self.assertEqual("h2o_feet", records[1].get_measurement())
259+
self.assertEqual(2, records[1].get_value())
260+
self.assertEqual("level water_level", records[1].get_field())
261+
262+
self.assertEqual("h2o_feet", records[2].get_measurement())
263+
self.assertEqual(3, records[2].get_value())
264+
self.assertEqual("level water_level", records[2].get_field())
265+
266+
self.assertEqual("h2o_feet", records[3].get_measurement())
267+
self.assertEqual(4, records[3].get_value())
268+
self.assertEqual("level water_level", records[3].get_field())
269+
self.delete_test_bucket(bucket)
270+
230271
def test_write_data_frame(self):
231272
from influxdb_client.extras import pd
232273

tests/test_WriteApiBatching.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,11 +311,16 @@ def test_record_types(self):
311311
_bytes2 = "h2o_feet,location=coyote_creek level\\ water_level=18.0 18".encode("utf-8")
312312
self._write_client.write("my-bucket", "my-org", [_bytes1, _bytes2])
313313

314+
# Tuple
315+
_bytes3 = "h2o_feet,location=coyote_creek level\\ water_level=19.0 19".encode("utf-8")
316+
_bytes4 = "h2o_feet,location=coyote_creek level\\ water_level=20.0 20".encode("utf-8")
317+
self._write_client.write("my-bucket", "my-org", (_bytes3, _bytes4, ))
318+
314319
time.sleep(1)
315320

316321
_requests = httpretty.httpretty.latest_requests
317322

318-
self.assertEqual(9, len(_requests))
323+
self.assertEqual(10, len(_requests))
319324

320325
self.assertEqual("h2o_feet,location=coyote_creek level\\ water_level=1.0 1\n"
321326
"h2o_feet,location=coyote_creek level\\ water_level=2.0 2", _requests[0].parsed_body)
@@ -335,6 +340,8 @@ def test_record_types(self):
335340
"h2o_feet,location=coyote_creek level\\ water_level=16.0 16", _requests[7].parsed_body)
336341
self.assertEqual("h2o_feet,location=coyote_creek level\\ water_level=17.0 17\n"
337342
"h2o_feet,location=coyote_creek level\\ water_level=18.0 18", _requests[8].parsed_body)
343+
self.assertEqual("h2o_feet,location=coyote_creek level\\ water_level=19.0 19\n"
344+
"h2o_feet,location=coyote_creek level\\ water_level=20.0 20", _requests[9].parsed_body)
338345

339346
pass
340347

0 commit comments

Comments
 (0)