diff --git a/firebase/__init__.py b/firebase/__init__.py old mode 100644 new mode 100755 index 81e94a6..59b65b6 --- a/firebase/__init__.py +++ b/firebase/__init__.py @@ -1,12 +1,12 @@ import requests -import urlparse #for urlparse and urljoin -import os #for os.path.dirname -import json #for dumps - +import urlparse #for urlparse and urljoin +import os #for os.path.dirname +import json #for dumps +from datetime import datetime class Firebase(): - ROOT_URL = '' #no trailing slash + ROOT_URL = '' #no trailing slash def __init__(self, root_url, auth_token=None): self.ROOT_URL = root_url.rstrip('/') @@ -24,7 +24,7 @@ def parent(self): #If url is the root of your Firebase, return None up = urlparse.urlparse(url) if up.path == '': - return None #maybe throw exception here? + return None #maybe throw exception here? return Firebase(url) def name(self): @@ -32,6 +32,7 @@ def name(self): def toString(self): return self.__str__() + def __str__(self): return self.ROOT_URL @@ -47,14 +48,14 @@ def update(self, data): def remove(self): return self.delete() - + #These mirror REST API functionality def put(self, data): - return self.__request('put', data = data) + return self.__request('put', data=data) def patch(self, data): - return self.__request('patch', data = data) + return self.__request('patch', data=data) def get(self): return self.__request('get') @@ -63,19 +64,26 @@ def get(self): #Firebase where a new child location with unique name is generated and #returned def post(self, data): - return self.__request('post', data = data) + return self.__request('post', data=data) def delete(self): return self.__request('delete') - #Private - def __request(self, method, **kwargs): #Firebase API does not accept form-encoded PUT/POST data. It needs to #be JSON encoded. + + # add in custom encoder for datetime objects + class Encoder(json.JSONEncoder): + def default(self, obj): + if isinstance(obj, datetime): + return obj.isoformat() + else: + return super(Encoder, self).default(obj) + if 'data' in kwargs: - kwargs['data'] = json.dumps(kwargs['data']) + kwargs['data'] = json.dumps(kwargs['data'], cls=Encoder) params = {} if self.auth_token: @@ -85,10 +93,9 @@ def __request(self, method, **kwargs): params.update({'auth': self.auth_token}) r = requests.request(method, self.__url(), params=params, **kwargs) - r.raise_for_status() #throw exception if error + r.raise_for_status() #throw exception if error return r.json() - def __url(self): #We append .json to end of ROOT_URL for REST API. return '%s.json' % self.ROOT_URL