Skip to content

Py3k and Py2k cross compat #42

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,17 @@
Copyright (c) 2012 TempoDB Inc. All rights reserved.
"""

from setuptools import setup
try:
from setuptools import setup
except ImportError:
from distutils.core import setup


install_requires = [
'python-dateutil==1.5',
'requests>=1.0',
'python-dateutil >= 2.0',
'requests >= 2.0',
'simplejson',
'six'
]

tests_require = [
Expand Down
2 changes: 1 addition & 1 deletion tempodb/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

try:
VERSION = __import__('pkg_resources').get_distribution('tempodb').version
except Exception, e:
except Exception as e:
VERSION = 'unknown'

def get_version():
Expand Down
16 changes: 11 additions & 5 deletions tempodb/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@

Copyright (c) 2012 TempoDB, Inc. All rights reserved.
"""
import six
from datetime import datetime
from dateutil.parser import parse


class Database(object):
Expand Down Expand Up @@ -65,7 +67,7 @@ def to_json(self):

@staticmethod
def from_json(json):
ts = datetime.strptime(json.get('t', ''), "%Y-%m-%dT%H:%M:%S.%fZ")
ts = parse(json.get('t', ''))
value = json.get('v', None)
dp = DataPoint(ts, value)
return dp
Expand All @@ -90,11 +92,14 @@ def __eq__(self, other):
def from_json(json):
series = Series.from_json(json.get('series', {}))

start_date = datetime.strptime(json.get('start', ''), "%Y-%m-%dT%H:%M:%S.%fZ")
end_date = datetime.strptime(json.get('end', ''), "%Y-%m-%dT%H:%M:%S.%fZ")
matcher = "%Y-%m-%dT%H:%M:%S.%fZ"

start_date = parse(json.get('start', ''))
end_date = parse(json.get('end', ''))

data = [DataPoint.from_json(dp) for dp in json.get("data", [])]
summary = Summary.from_json(json.get('summary', {})) if 'summary' in json else None
summary = Summary.from_json(
json.get('summary', {})) if 'summary' in json else None
return DataSet(series, start_date, end_date, data, summary)


Expand All @@ -112,11 +117,12 @@ def from_json(json):
summary.__dict__.update(json)
return summary


class DeleteSummary(object):

def __init__(self, deleted):
self.deleted = deleted

@staticmethod
def from_json(json):
return DeleteSummary(json['deleted'])

65 changes: 42 additions & 23 deletions tempodb/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@
import re
import requests
import simplejson
import urllib
import urllib2
from six.moves.urllib_parse import urlencode, quote

import tempodb
from tempodb import DataPoint, DataSet, DeleteSummary, Series, Summary
import six


API_HOST = 'api.tempo-db.com'
Expand All @@ -24,7 +24,8 @@
VALID_SERIES_KEY = r'^[a-zA-Z0-9\.:;\-_/\\ ]*$'
RE_VALID_SERIES_KEY = re.compile(VALID_SERIES_KEY)

DATETIME_HANDLER = lambda obj: obj.isoformat() if isinstance(obj, datetime.datetime) else None
DATETIME_HANDLER = lambda obj: obj.isoformat() if isinstance(
obj, datetime.datetime) else None


class Client(object):
Expand All @@ -36,8 +37,10 @@ def __init__(self, key, secret, host=API_HOST, port=API_PORT, secure=True, pool_
self.port = port
self.secure = secure
self.session = requests.session()
self.session.mount('http://', requests.adapters.HTTPAdapter(pool_connections=pool_connections, pool_maxsize=pool_maxsize))
self.session.mount('https://', requests.adapters.HTTPAdapter(pool_connections=pool_connections, pool_maxsize=pool_maxsize))
self.session.mount(
'http://', requests.adapters.HTTPAdapter(pool_connections=pool_connections, pool_maxsize=pool_maxsize))
self.session.mount(
'https://', requests.adapters.HTTPAdapter(pool_connections=pool_connections, pool_maxsize=pool_maxsize))

def get_series(self, ids=[], keys=[], tags=[], attributes={}):
params = self._normalize_params(ids, keys, tags, attributes)
Expand All @@ -53,7 +56,8 @@ def delete_series(self, ids=[], keys=[], tags=[], attributes={}, allow_truncatio

def create_series(self, key=None):
if key and not RE_VALID_SERIES_KEY.match(key):
raise ValueError("Series key must match the following regex: %s" % (VALID_SERIES_KEY,))
raise ValueError("Series key must match the following regex: %s" %
(VALID_SERIES_KEY,))

params = {}
if key is not None:
Expand All @@ -64,7 +68,8 @@ def create_series(self, key=None):
return series

def update_series(self, series):
json = self.request('/series/id/%s/' % (series.id,), method='PUT', params=series.to_json())
json = self.request('/series/id/%s/' %
(series.id,), method='PUT', params=series.to_json())
series = Series.from_json(json)
return series

Expand Down Expand Up @@ -120,7 +125,8 @@ def write_id(self, series_id, data):

def write_key(self, series_key, data):
if series_key and not RE_VALID_SERIES_KEY.match(series_key):
raise ValueError("Series key must match the following regex: %s" % (VALID_SERIES_KEY,))
raise ValueError("Series key must match the following regex: %s" %
(VALID_SERIES_KEY,))

series_type = 'key'
series_val = series_key
Expand All @@ -145,7 +151,8 @@ def increment_id(self, series_id, data):

def increment_key(self, series_key, data):
if series_key and not RE_VALID_SERIES_KEY.match(series_key):
raise ValueError("Series key must match the following regex: %s" % (VALID_SERIES_KEY,))
raise ValueError("Series key must match the following regex: %s" %
(VALID_SERIES_KEY,))

series_type = 'key'
series_val = series_key
Expand Down Expand Up @@ -177,10 +184,11 @@ def _read(self, series_type, series_val, start, end, interval="", function="", t
if tz:
params['tz'] = tz

url = '/series/%s/%s/data/' % (series_type, urllib2.quote(series_val, ""))
url = '/series/%s/%s/data/' % (series_type,
quote(series_val, ""))
json = self.request(url, method='GET', params=params)

#we got an error
# we got an error
if 'error' in json:
return json
return DataSet.from_json(json)
Expand All @@ -191,24 +199,28 @@ def _delete(self, series_type, series_val, start, end, options):
'end': end.isoformat(),
}
params.update(options)
url = '/series/%s/%s/data/' % (series_type, urllib2.quote(series_val, ""))
url = '/series/%s/%s/data/' % (series_type,
quote(series_val, ""))
json = self.request(url, method='DELETE', params=params)
return json

def _write(self, series_type, series_val, data):
url = '/series/%s/%s/data/' % (series_type, urllib2.quote(series_val, ""))
url = '/series/%s/%s/data/' % (series_type,
quote(series_val, ""))
body = [dp.to_json() for dp in data]
json = self.request(url, method='POST', params=body)
return json

def _increment(self, series_type, series_val, data):
url = '/series/%s/%s/increment/' % (series_type, urllib2.quote(series_val, ""))
url = '/series/%s/%s/increment/' % (series_type,
quote(series_val, ""))
body = [dp.to_json() for dp in data]
json = self.request(url, method='POST', params=body)
return json

def request(self, target, method='GET', params={}):
assert method in ['GET', 'POST', 'PUT', 'DELETE'], "Only 'GET', 'POST', 'PUT', 'DELETE' are allowed for method."
assert method in ['GET', 'POST', 'PUT',
'DELETE'], "Only 'GET', 'POST', 'PUT', 'DELETE' are allowed for method."

headers = {
'User-Agent': 'tempodb-python/%s' % (tempodb.get_version(), ),
Expand All @@ -219,27 +231,31 @@ def request(self, target, method='GET', params={}):
headers['Content-Type'] = "application/json"
base = self.build_full_url(target)
json_data = simplejson.dumps(params, default=DATETIME_HANDLER)
response = self.session.post(base, data=json_data, auth=(self.key, self.secret), headers=headers)
response = self.session.post(
base, data=json_data, auth=(self.key, self.secret), headers=headers)
elif method == 'PUT':
headers['Content-Type'] = "application/json"
base = self.build_full_url(target)
json_data = simplejson.dumps(params, default=DATETIME_HANDLER)
response = self.session.put(base, data=json_data, auth=(self.key, self.secret), headers=headers)
response = self.session.put(
base, data=json_data, auth=(self.key, self.secret), headers=headers)
elif method == 'DELETE':
base = self.build_full_url(target, params)
response = self.session.delete(base, auth=(self.key, self.secret), headers=headers)
response = self.session.delete(
base, auth=(self.key, self.secret), headers=headers)
else:
base = self.build_full_url(target, params)
response = self.session.get(base, auth=(self.key, self.secret), headers=headers)
response = self.session.get(
base, auth=(self.key, self.secret), headers=headers)

if response.status_code == 200:
if response.text:
json = simplejson.loads(response.text)
else:
json = ''
#try:
# try:
# json = simplejson.loads(response.text)
#except simplejson.decoder.JSONDecodeError, err:
# except simplejson.decoder.JSONDecodeError, err:
# json = dict(error="JSON Parse Error (%s):\n%s" % (err, response.text))
else:
json = dict(error=response.text)
Expand All @@ -260,7 +276,7 @@ def build_url(self, url, params={}):

def _urlencode(self, params):
p = []
for key, value in params.iteritems():
for key, value in six.iteritems(params):
if isinstance(value, (list, tuple)):
for v in value:
p.append((key, v))
Expand All @@ -271,7 +287,10 @@ def _urlencode(self, params):
p.append((key, str(value).lower()))
else:
p.append((key, str(value)))
return urllib.urlencode(p).encode("UTF-8")

# We shouldn't need the explicit encoding cast at all, but I'm
# leaving it in for legacy's sake
return urlencode(p) if six.PY3 else urlencode(p).encode("UTF-8")

def _normalize_params(self, ids=[], keys=[], tags=[], attributes={}):
params = {}
Expand Down
3 changes: 2 additions & 1 deletion tempodb/demo/tempodb-bulk-write-demo.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""
http://tempo-db.com/api/write-series/#bulk-write-multiple-series
"""
from __future__ import print_function

import datetime
from tempodb import Client
Expand All @@ -20,4 +21,4 @@
{ 'key': 'custom-series-key4', 'v': 4.44 },
]

print client.write_bulk(ts, data)
print(client.write_bulk(ts, data))
3 changes: 2 additions & 1 deletion tempodb/demo/tempodb-read-demo.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""
http://tempo-db.com/api/read-series/#read-series-by-key
"""
from __future__ import print_function

import datetime
from tempodb import Client
Expand All @@ -18,4 +19,4 @@
data = client.read_key(SERIES_KEY, start, end)

for datapoint in data.data:
print datapoint
print(datapoint)
3 changes: 2 additions & 1 deletion tempodb/demo/tempodb-write-demo.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""
http://tempo-db.com/api/write-series/#write-series-by-key
"""
from __future__ import print_function

import datetime
import random
Expand All @@ -17,7 +18,7 @@

for day in range(1, 10):
# print out the current day we are sending data for
print date
print(date)

data = []
# 1440 minutes in one day
Expand Down
Loading