Skip to content
This repository was archived by the owner on Aug 26, 2019. It is now read-only.

added custom json encoder for datetime objects and (unintentional) code formatting #6

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
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
37 changes: 22 additions & 15 deletions firebase/__init__.py
100644 → 100755
Original file line number Diff line number Diff line change
@@ -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('/')
Expand All @@ -24,14 +24,15 @@ 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):
return os.path.basename(self.ROOT_URL)

def toString(self):
return self.__str__()

def __str__(self):
return self.ROOT_URL

Expand All @@ -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')
Expand All @@ -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:
Expand All @@ -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