diff --git a/.circleci/config.yml b/.circleci/config.yml index f89a8cea..11104ba4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -16,12 +16,14 @@ commands: parameters: python-image: type: string + enabled-ciso-8601: + type: boolean steps: - restore_cache: name: Restoring Pip Cache keys: - - &cache-key pip-cache-v8-<< parameters.python-image >>-{{ checksum "requirements.txt" }}-{{ checksum "test-requirements.txt" }}-{{ checksum "extra-requirements.txt" }} - - pip-cache-v8-<< parameters.python-image >>- + - &cache-key pip-cache-v9-<< parameters.python-image >>-<< parameters.enabled-ciso-8601 >>-{{ checksum "requirements.txt" }}-{{ checksum "test-requirements.txt" }}-{{ checksum "extra-requirements.txt" }}-{{ checksum "ciso-requirements.txt" }} + - pip-cache-v9-<< parameters.python-image >>-<< parameters.enabled-ciso-8601 >>- - run: command: | # use pipenv to install dependencies sudo pip install pipenv @@ -48,15 +50,20 @@ jobs: influxdb-image: type: string default: "influxdb:2.0.0-beta" + enabled-ciso-8601: + type: boolean + default: true docker: - image: << parameters.python-image >> environment: # environment variables for primary container PIPENV_VENV_IN_PROJECT: true + ENABLED_CISO_8601: << parameters.enabled-ciso-8601 >> - image: quay.io/influxdb/<< parameters.influxdb-image >> steps: - prepare - client-test: python-image: << parameters.python-image >> + enabled-ciso-8601: << parameters.enabled-ciso-8601 >> - store_test_results: path: test-reports - run: @@ -69,6 +76,9 @@ workflows: jobs: - tests-python: name: python-3.6 + - tests-python: + name: python-3.6-without-ciso8601 + enabled-ciso-8601: false - tests-python: name: python-3.6-nightly influxdb-image: "influx:nightly" diff --git a/CHANGELOG.md b/CHANGELOG.md index 907eedff..da7255af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ### Features 1. [#112](https://github.com/influxdata/influxdb-client-python/pull/113): Support timestamp with different timezone in _convert_timestamp +1. [#120](https://github.com/influxdata/influxdb-client-python/pull/120): ciso8601 is an optional dependency and has to be installed separably ## 1.8.0 [2020-06-19] diff --git a/README.rst b/README.rst index 2bd9df8f..755c18b4 100644 --- a/README.rst +++ b/README.rst @@ -76,7 +76,7 @@ InfluxDB python library uses `RxPY `__ - The .. note:: - The client uses ``ciso8601`` for parsing dates. ``ciso8601`` is much faster than built-in Python datetime. Since it's written as a ``C`` module the best way is build it from sources: + It is recommended to use ``ciso8601`` with client for parsing dates. ``ciso8601`` is much faster than built-in Python datetime. Since it's written as a ``C`` module the best way is build it from sources: **Windows**: @@ -93,7 +93,7 @@ The python package is hosted on `PyPI =2.1.1 \ No newline at end of file diff --git a/influxdb_client/client/date_utils.py b/influxdb_client/client/date_utils.py new file mode 100644 index 00000000..9e9282c0 --- /dev/null +++ b/influxdb_client/client/date_utils.py @@ -0,0 +1,15 @@ +from dateutil import parser + +parse_function = None + + +def get_date_parse_function(): + global parse_function + if parse_function is None: + try: + import ciso8601 + parse_function = ciso8601.parse_datetime + except ModuleNotFoundError: + parse_function = parser.parse + + return parse_function diff --git a/influxdb_client/client/flux_csv_parser.py b/influxdb_client/client/flux_csv_parser.py index 4e64fc49..8f3500fd 100644 --- a/influxdb_client/client/flux_csv_parser.py +++ b/influxdb_client/client/flux_csv_parser.py @@ -4,9 +4,9 @@ from enum import Enum from typing import List -import ciso8601 from urllib3 import HTTPResponse +from influxdb_client.client.date_utils import get_date_parse_function from influxdb_client.client.flux_table import FluxTable, FluxColumn, FluxRecord @@ -194,7 +194,7 @@ def _to_value(self, str_val, column): if "dateTime:RFC3339" == column.data_type or "dateTime:RFC3339Nano" == column.data_type: # todo nanosecods precision # return str_val - return ciso8601.parse_datetime(str_val) + return get_date_parse_function()(str_val) # return timestamp_parser(str_val) if "duration" == column.data_type: @@ -230,4 +230,4 @@ def add_column_names_and_tags(table, csv): def _insert_table(self, table, table_index): if self._serialization_mode is FluxSerializationMode.tables: - self.tables.insert(table_index, table) \ No newline at end of file + self.tables.insert(table_index, table) diff --git a/influxdb_client/client/write/point.py b/influxdb_client/client/write/point.py index d50117c0..ab740542 100644 --- a/influxdb_client/client/write/point.py +++ b/influxdb_client/client/write/point.py @@ -4,10 +4,10 @@ from decimal import Decimal from numbers import Integral -import ciso8601 from pytz import UTC from six import iteritems +from influxdb_client.client.date_utils import get_date_parse_function from influxdb_client.domain.write_precision import WritePrecision EPOCH = UTC.localize(datetime.utcfromtimestamp(0)) @@ -45,6 +45,7 @@ def __init__(self, measurement_name): self._name = measurement_name self._time = None self._write_precision = DEFAULT_WRITE_PRECISION + pass def time(self, time, write_precision=DEFAULT_WRITE_PRECISION): """ @@ -153,7 +154,7 @@ def _convert_timestamp(timestamp, precision=DEFAULT_WRITE_PRECISION): return timestamp # assume precision is correct if timestamp is int if isinstance(timestamp, str): - timestamp = ciso8601.parse_datetime(timestamp) + timestamp = get_date_parse_function()(timestamp) if isinstance(timestamp, timedelta) or isinstance(timestamp, datetime): diff --git a/requirements.txt b/requirements.txt index 1cd82e90..e01aa257 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,5 +4,4 @@ six >= 1.10 python_dateutil >= 2.5.3 setuptools >= 21.0.0 urllib3 >= 1.15.1 -ciso8601>=2.1.1 pytz>=2019.1 diff --git a/scripts/ci-test.sh b/scripts/ci-test.sh index f95dd168..9b9824bd 100755 --- a/scripts/ci-test.sh +++ b/scripts/ci-test.sh @@ -2,6 +2,8 @@ set -e +ENABLED_CISO_8601="${ENABLED_CISO_8601:-true}" + # # Install requirements # @@ -9,6 +11,12 @@ python --version pip install -r requirements.txt --user pip install -r extra-requirements.txt --user pip install -r test-requirements.txt --user +if [ "$ENABLED_CISO_8601" = true ] ; then + echo "ciso8601 is enabled" + pip install -r ciso-requirements.txt --user +else + echo "ciso8601 is disabled" +fi pip install pytest pytest-cov --user pip install twine --user python setup.py sdist bdist_wheel diff --git a/setup.py b/setup.py index c242bbe0..74b1aced 100644 --- a/setup.py +++ b/setup.py @@ -13,6 +13,9 @@ with open('extra-requirements.txt', 'r') as f: extra_requires = [x.strip() for x in f if x.strip()] +with open('ciso-requirements.txt', 'r') as f: + ciso_requires = [x.strip() for x in f if x.strip()] + with open('README.rst', 'r') as f: readme = f.read() @@ -32,13 +35,13 @@ keywords=["InfluxDB", "InfluxDB Python Client"], tests_require=test_requires, install_requires=requires, - extras_require={'extra': extra_requires}, + extras_require={'extra': extra_requires, 'ciso': ciso_requires}, long_description_content_type="text/x-rst", packages=find_packages(), test_suite='tests', python_requires='>=3.6', include_package_data=True, - data_files=['requirements.txt', 'extra-requirements.txt', 'test-requirements.txt'], + data_files=['requirements.txt', 'extra-requirements.txt', 'test-requirements.txt', 'ciso-requirements.txt'], classifiers = [ 'Development Status :: 4 - Beta', 'Intended Audience :: Developers',