107 lines
3.4 KiB
Python
107 lines
3.4 KiB
Python
import json
|
|
|
|
from urllib3 import connection_from_url
|
|
from urllib import urlencode, quote
|
|
|
|
#fork of ApiClient Class: https://github.com/shazow/apiclient
|
|
class Client(object):
|
|
BASE_URL = 'https://io.adafruit.com/'
|
|
|
|
def __init__(self, key, rate_limit_lock=None):
|
|
self.key = key
|
|
self.rate_limit_lock = rate_limit_lock
|
|
self.connection_pool = self._make_connection_pool(self.BASE_URL)
|
|
|
|
def _make_connection_pool(self, url):
|
|
return connection_from_url(url)
|
|
|
|
def _compose_url(self, path):
|
|
return self.BASE_URL + path
|
|
|
|
def _compose_get_url(self, path, params=None):
|
|
return self.BASE_URL + path + '?' + urlencode(params)
|
|
|
|
def _handle_response(self, response):
|
|
return json.loads(response.data)
|
|
|
|
def _request(self, method, path, params=None):
|
|
if (method.lower() == "get"):
|
|
url = self._compose_get_url(path, params)
|
|
else:
|
|
url = self._compose_url(path)
|
|
|
|
self.rate_limit_lock and self.rate_limit_lock.acquire()
|
|
headers = {"X-AIO-Key": self.key, 'Content-Type':'application/json'}
|
|
if (method.upper() == "GET"):
|
|
r = self.connection_pool.urlopen(method.upper(), url, headers=headers)
|
|
else:
|
|
r = self.connection_pool.urlopen(method.upper(), url, headers=headers, body=json.dumps(params))
|
|
|
|
return self._handle_response(r)
|
|
|
|
def _get(self, path, **params):
|
|
return self._request('GET', path, params=params)
|
|
|
|
def _post(self, path, params):
|
|
return self._request('POST', path, params=params)
|
|
|
|
#stream functionality
|
|
def send(self, feed_name, data):
|
|
feed_name = quote(feed_name)
|
|
path = "api/feeds/{}/streams/send".format(feed_name)
|
|
return self._post(path, {'value': data})
|
|
|
|
def receive(self, feed_name):
|
|
feed_name = quote(feed_name)
|
|
path = "api/feeds/{}/streams/last".format(feed_name)
|
|
return self._get(path)
|
|
|
|
def receive_next(self, feed_name):
|
|
feed_name = quote(feed_name)
|
|
path = "api/feeds/{}/streams/next".format(feed_name)
|
|
return self._get(path)
|
|
|
|
def receive_previous(self, feed_name):
|
|
feed_name = quote(feed_name)
|
|
path = "api/feeds/{}/streams/last".format(feed_name)
|
|
return self._get(path)
|
|
|
|
def streams(self, feed_id_or_key, stream_id=None):
|
|
if stream_id is None:
|
|
path = "api/feeds/{}/streams".format(feed_id_or_key)
|
|
else:
|
|
path = "api/feeds/{}/streams/{}".format(feed_id_or_key, stream_id)
|
|
return self._get(path)
|
|
|
|
def create_stream(self, feed_id_or_key, data):
|
|
path = "api/feeds/{}/streams".format(feed_id_or_key)
|
|
return self._post(path, data)
|
|
|
|
#group functionality
|
|
def send_group(self, group_name, data):
|
|
group_name = quote(group_name)
|
|
path = "api/groups/{}/send".format(group_name)
|
|
return self._post(path, {'value': data})
|
|
|
|
def receive_group(self, group_name):
|
|
group_name = quote(group_name)
|
|
path = "api/groups/{}/last".format(group_name)
|
|
return self._get(path)
|
|
|
|
def receive_next_group(self, group_name):
|
|
group_name = quote(group_name)
|
|
path = "api/groups/{}/next".format(group_name)
|
|
return self._get(path)
|
|
|
|
def receive_previous_group(self, group_name):
|
|
group_name = quote(group_name)
|
|
path = "api/groups/{}/last".format(group_name)
|
|
return self._get(path)
|
|
|
|
def groups(self, group_id_or_key):
|
|
path = "api/groups/{}".format(group_id_or_key)
|
|
return self._get(path)
|
|
|
|
def create_group(self, group_id_or_key, data):
|
|
path = "api/groups/{}".format(group_id_or_key)
|
|
return self._post(path, data)
|