def findpath(parser, s): '''returns (server url, path component)''' if s == '.': return client.DEFAULT_BASE_URL, '' if not s.startswith('http'): return client.DEFAULT_BASE_URL, s bits = urlparse.urlparse(s) res = http.Resource('%s://%s/' % (bits.scheme, bits.netloc), None) parts = bits.path.split('/')[1:] if parts and not parts[-1]: parts = parts[:-1] cut = None for i in range(0, len(parts) + 1): try: data = res.get_json(parts[:i])[2] except Exception: data = None if data and 'couchdb' in data: cut = i if cut is None: raise parser.error("'%s' does not appear to be a CouchDB" % s) base = res.url + (parts[:cut] and '/'.join(parts[:cut]) or '') return base, '/'.join(parts[cut:])
def __init__(self, url, name=None, session=None): if isinstance(url, util.strbase): if not url.startswith('http'): url = DEFAULT_BASE_URL + url self.resource = http.Resource(url, session) else: self.resource = url self._name = name
def search(self, db, view, **params): """ Runs a full text search on the db. """ import urllib if db == None: db = connect("shiftspace/master") uri = 'http://localhost:5984/%s/_fti/_design/lucene' % urllib.quote_plus( db.name) resource = http.Resource(uri, None) status, msg, response = resource.get_json(path=view, **params) return response.get("rows")
def fetch(db=None, view=None, keys=None): """ Fetch multiple documents from the database. Useful when joins are necessary and making multiple requests to the db is an undesirable performance hit. Paramters: db - defaults to 'shiftspace' view - defaults to '_all_docs' """ import urllib if db == None: db = connect() reduce = False if isinstance(view, ViewDefinition): viewpath = "/".join(["_design", view.design, "_view", view.name]) reduce = (view.reduce_fun != None) else: viewpath = "_all_docs" uri = 'http://localhost:5984/%s/%s' % (urllib.quote_plus( db.name), viewpath) resource = http.Resource(uri, None) params = None if reduce != True: params = {"include_docs": True} else: params = {"group": True} status, message, response = resource.post_json(body={"keys": keys}, **params) rows = response["rows"] if viewpath == "_all_docs": result = [] for row in rows: value = row.get('value') if value and not value.get("deleted"): result.append(row['doc']) else: result.append(None) return result else: kvs = toDict(rows) result = [] for key in keys: key = toStr(key) result.append((kvs.get(key) and kvs.get(key)["value"]) or None) return result
def __init__(self, url=DEFAULT_BASE_URL, full_commit=True, session=None): """Initialize the server object. :param url: the URI of the server (for example ``http://localhost:5984/``) :param full_commit: turn on the X-Couch-Full-Commit header :param session: an http.Session instance or None for a default session """ if isinstance(url, util.strbase): self.resource = http.Resource(url, session or http.Session()) else: self.resource = url # treat as a Resource object if not full_commit: self.resource.headers['X-Couch-Full-Commit'] = 'false'
def test_init_with_resource(self): sess = http.Session() res = http.Resource(client.DEFAULT_BASE_URL, sess) serv = client.Server(url=res) serv.config()
def get_or_create(url, name): resource = http.Resource(url, session=None) try: return resource.head(name) except http.ResourceNotFound: resource.put_json(name)
def __init__(self, url, wrapper=None, session=None): if isinstance(url, util.strbase): self.resource = http.Resource(url, session) else: self.resource = url self.wrapper = wrapper