diff --git a/.travis.yml b/.travis.yml index 868fe5cc..1dd2c78d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,30 +1,38 @@ language: python + addons: apt: packages: - wget -env: - - TOX_ENV=py27 -# - TOX_ENV=py32 -# Disabling py32 tests until the following issue is fixed: -# pip 8.x breaks python 3.2 compatibility -# https://github.com/pypa/pip/issues/3390 - - TOX_ENV=py33 - - TOX_ENV=py34 - - TOX_ENV=pypy - - TOX_ENV=pypy3 - - TOX_ENV=docs - - TOX_ENV=flake8 - - TOX_ENV=coverage + +matrix: + include: + - python: 2.7 + env: TOX_ENV=py27 + - python: pypy-5.3.1 + env: TOX_ENV=pypy + - python: 3.4 + env: TOX_ENV=py34 +# An issue in travis-ci prevents this case from running +# Link to issue: https://github.com/travis-ci/travis-ci/issues/6304 +# - python: pypy3.3-5.2-alpha1 +# env: TOX_ENV=pypy3 + - python: 3.4 + env: TOX_ENV=docs + - python: 3.4 + env: TOX_ENV=flake8 + - python: 3.4 + env: TOX_ENV=coverage + install: - pip install tox - pip install coveralls - mkdir influxdb_install - - wget https://dl.influxdata.com/influxdb/releases/influxdb_0.13.0_amd64.deb + - wget https://dl.influxdata.com/influxdb/releases/influxdb_1.1.0_amd64.deb - dpkg -x influxdb*.deb influxdb_install script: - export INFLUXDB_PYTHON_INFLUXD_PATH=$(pwd)/influxdb_install/usr/bin/influxd - - travis_wait 30 tox -e $TOX_ENV + - tox -e $TOX_ENV after_success: - if [ "$TOX_ENV" == "coverage" ] ; then coveralls; fi notifications: diff --git a/README.rst b/README.rst index d3a8d775..a88ce0f2 100644 --- a/README.rst +++ b/README.rst @@ -22,10 +22,10 @@ InfluxDB is an open-source distributed time series database, find more about Inf .. _installation: -InfluxDB v0.8.X users -===================== +InfluxDB pre v1.1.0 users +========================= -InfluxDB 0.9 was released and it is the new recommended version. However, InfluxDB 0.8.x users may still use the legacy client by using ``from influxdb.influxdb08 import InfluxDBClient`` instead. +InfluxDB 1.1.0 was released and it is the new recommended version. InfluxDB 0.8.x users may still use the legacy client by using ``from influxdb.influxdb08 import InfluxDBClient`` instead. Installation ============ diff --git a/influxdb/_dataframe_client.py b/influxdb/_dataframe_client.py index 0341a41d..5f81e4c8 100644 --- a/influxdb/_dataframe_client.py +++ b/influxdb/_dataframe_client.py @@ -273,8 +273,12 @@ def _convert_dataframe_to_lines(self, }.get(time_precision, 1) # Make array of timestamp ints - time = ((dataframe.index.to_datetime().values.astype(int) / - precision_factor).astype(int).astype(str)) + if isinstance(dataframe.index, pd.tseries.period.PeriodIndex): + time = ((dataframe.index.to_timestamp().values.astype(int) / + precision_factor).astype(int).astype(str)) + else: + time = ((pd.to_datetime(dataframe.index).values.astype(int) / + precision_factor).astype(int).astype(str)) # If tag columns exist, make an array of formatted tag keys and values if tag_columns: diff --git a/influxdb/influxdb08/dataframe_client.py b/influxdb/influxdb08/dataframe_client.py index 28173e6e..ba302af8 100644 --- a/influxdb/influxdb08/dataframe_client.py +++ b/influxdb/influxdb08/dataframe_client.py @@ -132,7 +132,12 @@ def _convert_dataframe_to_json(self, dataframe, name, time_precision='s'): isinstance(dataframe.index, pd.tseries.index.DatetimeIndex)): raise TypeError('Must be DataFrame with DatetimeIndex or \ PeriodIndex.') - dataframe.index = dataframe.index.to_datetime() + + if isinstance(dataframe.index, pd.tseries.period.PeriodIndex): + dataframe.index = dataframe.index.to_timestamp() + else: + dataframe.index = pd.to_datetime(dataframe.index) + if dataframe.index.tzinfo is None: dataframe.index = dataframe.index.tz_localize('UTC') dataframe['time'] = [self._datetime_to_epoch(dt, time_precision) diff --git a/influxdb/tests/server_tests/client_test_with_server.py b/influxdb/tests/server_tests/client_test_with_server.py index 86faf204..d81054c9 100644 --- a/influxdb/tests/server_tests/client_test_with_server.py +++ b/influxdb/tests/server_tests/client_test_with_server.py @@ -431,8 +431,8 @@ def test_default_retention_policy(self): rsp = self.cli.get_list_retention_policies() self.assertEqual( [ - {'name': 'default', - 'duration': '0', + {'name': 'autogen', + 'duration': '0s', 'replicaN': 1, 'shardGroupDuration': u'168h0m0s', 'default': True} @@ -447,11 +447,11 @@ def test_create_retention_policy_default(self): self.assertEqual( [ - {'duration': '0', + {'duration': '0s', 'default': False, 'replicaN': 1, 'shardGroupDuration': u'168h0m0s', - 'name': 'default'}, + 'name': 'autogen'}, {'duration': '24h0m0s', 'default': True, 'replicaN': 1, @@ -468,14 +468,17 @@ def test_create_retention_policy_default(self): def test_create_retention_policy(self): self.cli.create_retention_policy('somename', '1d', 1) + # NB: creating a retention policy without specifying + # shard group duration + # leads to a shard group duration of 1 hour rsp = self.cli.get_list_retention_policies() self.assertEqual( [ - {'duration': '0', + {'duration': '0s', 'default': True, 'replicaN': 1, 'shardGroupDuration': u'168h0m0s', - 'name': 'default'}, + 'name': 'autogen'}, {'duration': '24h0m0s', 'default': False, 'replicaN': 1, @@ -491,18 +494,19 @@ def test_alter_retention_policy(self): # Test alter duration self.cli.alter_retention_policy('somename', 'db', duration='4d') + # NB: altering retention policy doesn't change shard group duration rsp = self.cli.get_list_retention_policies() self.assertEqual( [ - {'duration': '0', + {'duration': '0s', 'default': True, 'replicaN': 1, 'shardGroupDuration': u'168h0m0s', - 'name': 'default'}, + 'name': 'autogen'}, {'duration': '96h0m0s', 'default': False, 'replicaN': 1, - 'shardGroupDuration': u'24h0m0s', + 'shardGroupDuration': u'1h0m0s', 'name': 'somename'} ], rsp @@ -511,18 +515,19 @@ def test_alter_retention_policy(self): # Test alter replication self.cli.alter_retention_policy('somename', 'db', replication=4) + # NB: altering retention policy doesn't change shard group duration rsp = self.cli.get_list_retention_policies() self.assertEqual( [ - {'duration': '0', + {'duration': '0s', 'default': True, 'replicaN': 1, 'shardGroupDuration': u'168h0m0s', - 'name': 'default'}, + 'name': 'autogen'}, {'duration': '96h0m0s', 'default': False, 'replicaN': 4, - 'shardGroupDuration': u'24h0m0s', + 'shardGroupDuration': u'1h0m0s', 'name': 'somename'} ], rsp @@ -531,18 +536,19 @@ def test_alter_retention_policy(self): # Test alter default self.cli.alter_retention_policy('somename', 'db', default=True) + # NB: altering retention policy doesn't change shard group duration rsp = self.cli.get_list_retention_policies() self.assertEqual( [ - {'duration': '0', + {'duration': '0s', 'default': False, 'replicaN': 1, 'shardGroupDuration': u'168h0m0s', - 'name': 'default'}, + 'name': 'autogen'}, {'duration': '96h0m0s', 'default': True, 'replicaN': 4, - 'shardGroupDuration': u'24h0m0s', + 'shardGroupDuration': u'1h0m0s', 'name': 'somename'} ], rsp @@ -558,11 +564,11 @@ def test_alter_retention_policy_invalid(self): rsp = self.cli.get_list_retention_policies() self.assertEqual( [ - {'duration': '0', + {'duration': '0s', 'default': True, 'replicaN': 1, 'shardGroupDuration': u'168h0m0s', - 'name': 'default'}, + 'name': 'autogen'}, {'duration': '24h0m0s', 'default': False, 'replicaN': 1, @@ -580,11 +586,11 @@ def test_drop_retention_policy(self): rsp = self.cli.get_list_retention_policies() self.assertEqual( [ - {'duration': '0', + {'duration': '0s', 'default': True, 'replicaN': 1, 'shardGroupDuration': u'168h0m0s', - 'name': 'default'} + 'name': 'autogen'} ], rsp ) diff --git a/tox.ini b/tox.ini index ddc15514..856a4717 100644 --- a/tox.ini +++ b/tox.ini @@ -1,12 +1,12 @@ [tox] -envlist = py34, py27, pypy, flake8 +envlist = py27, py34, pypy, pypy3, flake8, coverage, docs [testenv] passenv = INFLUXDB_PYTHON_INFLUXD_PATH setenv = INFLUXDB_PYTHON_SKIP_SERVER_TESTS=False deps = -r{toxinidir}/requirements.txt -r{toxinidir}/test-requirements.txt - py27,py32,py33,py34,py26: pandas + py27,py34: pandas # Only install pandas with non-pypy interpreters commands = nosetests -v --with-doctest {posargs}