Skip to content

Commit 3927736

Browse files
committed
feat: ciso8601 as optional dependency #98
1 parent caf42dc commit 3927736

File tree

2 files changed

+18
-31
lines changed

2 files changed

+18
-31
lines changed

influxdb_client/client/flux_csv_parser.py

+8-25
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ def __init__(self, response: HTTPResponse, serialization_mode: FluxSerialization
3636
self._serialization_mode = serialization_mode
3737
self._data_frame_index = data_frame_index
3838
self._data_frame_values = []
39+
40+
self._parse_function = get_date_parse_function()
3941
pass
4042

4143
def __enter__(self):
@@ -195,7 +197,7 @@ def _to_value(self, str_val, column):
195197
if "dateTime:RFC3339" == column.data_type or "dateTime:RFC3339Nano" == column.data_type:
196198
# todo nanosecods precision
197199
# return str_val
198-
return parse_string_to_datetime(str_val)
200+
return self._parse_function(str_val)
199201
# return timestamp_parser(str_val)
200202

201203
if "duration" == column.data_type:
@@ -234,28 +236,9 @@ def _insert_table(self, table, table_index):
234236
self.tables.insert(table_index, table)
235237

236238

237-
def parse_string_to_datetime(date):
238-
if is_module_available("ciso8601"):
239+
def get_date_parse_function():
240+
try:
239241
import ciso8601
240-
return ciso8601.parse_datetime(date)
241-
else:
242-
return parser.parse(date)
243-
244-
245-
def is_module_available(module_name):
246-
module = None
247-
248-
if sys.version_info < (3, 0):
249-
# python 2
250-
import importlib
251-
module = importlib.find_loader(module_name)
252-
elif sys.version_info <= (3, 3):
253-
# python 3.0 to 3.3
254-
import pkgutil
255-
module = pkgutil.find_loader(module_name)
256-
elif sys.version_info >= (3, 4):
257-
# python 3.4 and above
258-
import importlib
259-
module = importlib.util.find_spec(module_name)
260-
261-
return module is not None
242+
return ciso8601.parse_datetime
243+
except ModuleNotFoundError:
244+
return parser.parse

influxdb_client/client/write/point.py

+10-6
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@
44
from decimal import Decimal
55
from numbers import Integral
66

7+
from dateutil.parser import parser
78
from pytz import UTC
89
from six import iteritems
910

10-
from influxdb_client.client.flux_csv_parser import parse_string_to_datetime
11+
from influxdb_client.client.flux_csv_parser import get_date_parse_function
1112
from influxdb_client.domain.write_precision import WritePrecision
1213

1314
EPOCH = UTC.localize(datetime.utcfromtimestamp(0))
@@ -46,6 +47,9 @@ def __init__(self, measurement_name):
4647
self._time = None
4748
self._write_precision = DEFAULT_WRITE_PRECISION
4849

50+
self._parse_function = get_date_parse_function()
51+
pass
52+
4953
def time(self, time, write_precision=DEFAULT_WRITE_PRECISION):
5054
"""
5155
Specify timestamp for DataPoint with declared precision.
@@ -80,7 +84,7 @@ def to_line_protocol(self):
8084
_fields = _append_fields(self._fields)
8185
if not _fields:
8286
return ""
83-
_time = _append_time(self._time, self._write_precision)
87+
_time = _append_time(self._time, self._write_precision, self._parse_function)
8488

8589
return f"{_measurement}{_tags}{_fields}{_time}"
8690

@@ -127,10 +131,10 @@ def _append_fields(fields):
127131
return f"{','.join(_return)}"
128132

129133

130-
def _append_time(time, write_precision):
134+
def _append_time(time, write_precision, _parse_function):
131135
if time is None:
132136
return ''
133-
return f" {int(_convert_timestamp(time, write_precision))}"
137+
return f" {int(_convert_timestamp(time, write_precision, _parse_function))}"
134138

135139

136140
def _escape_key(tag):
@@ -148,12 +152,12 @@ def _escape_string(value):
148152
return str(value).translate(_ESCAPE_STRING)
149153

150154

151-
def _convert_timestamp(timestamp, precision=DEFAULT_WRITE_PRECISION):
155+
def _convert_timestamp(timestamp, precision=DEFAULT_WRITE_PRECISION, _parse_function=parser.parse):
152156
if isinstance(timestamp, Integral):
153157
return timestamp # assume precision is correct if timestamp is int
154158

155159
if isinstance(timestamp, str):
156-
timestamp = parse_string_to_datetime(timestamp)
160+
timestamp = _parse_function(timestamp)
157161

158162
if isinstance(timestamp, timedelta) or isinstance(timestamp, datetime):
159163

0 commit comments

Comments
 (0)