Skip to content

Instantly share code, notes, and snippets.

@brunomlopes
Forked from anonymous/ravendb.py
Last active December 10, 2015 06:58
Show Gist options
  • Save brunomlopes/4397669 to your computer and use it in GitHub Desktop.
Save brunomlopes/4397669 to your computer and use it in GitHub Desktop.
A very dumb and simple API to get and put objects from ravendb
# gist: https://gist.github.com/4397669
import logging, requests, simplejson
from datetime import datetime
dthandler = lambda obj: obj.isoformat() if isinstance(obj, datetime) else None
def dumps(obj):
return simplejson.dumps(obj, use_decimal=True, default=dthandler)
l = logging.getLogger("ravendb")
class RavenDbOauthSession:
def __init__(self, base_url, api_key):
self.base_url = base_url
self.api_key = api_key
self._init = False
def request(self, url):
full_url = self.base_url+"/"+url
self._getOauthAccessData(full_url)
headers = {
'Authorization':"Bearer "+self._oauthData,
}
l.debug("GET "+url)
r = requests.get(full_url, headers=headers)
if r.json:
r.decimal_json = simplejson.loads(r.content, use_decimal=True)
r.raise_for_status()
return r
def put(self, url_id, instance_type_name, instance_to_dump):
full_url = '%(base_url)s/docs/%(id)s' % dict(base_url=self.base_url, id=url_id)
self._getOauthAccessData(full_url)
headers = {
'Authorization':"Bearer "+self._oauthData,
'Raven-Entity-Name': instance_type_name,
}
l.debug("PUT "+full_url)
r = requests.put(full_url, data=dumps(instance_to_dump), headers=headers)
if(r.status_code != 201):
r.raise_for_status()
def _getOauthAccessData(self, url):
if self._init: return
l.debug("grabbing oauth code")
tripwire_request = requests.get(url)
if tripwire_request.status_code != 401:
l.debug("Expected unauthorised")
r.raise_for_status()
oauthUrl = tripwire_request.headers["OAuth-Source"]
headers = {
'content-type': 'application/json',
'accept': 'application/json;charset=UTF-8',
'grant_type': "client_credentials",
'Api-Key': self.api_key
}
rOauth = requests.get(oauthUrl, headers=headers)
if(rOauth.status_code != 200):
l.debug("Error getting ticket.")
l.debug("Headers : "+repr(rOauth.headers))
l.debug("Headers : "+repr(rOauth.content))
rOauth.raise_for_status()
self._oauthData = rOauth.content
self._init = True
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment