summaryrefslogtreecommitdiff
path: root/src/couch
diff options
context:
space:
mode:
Diffstat (limited to 'src/couch')
-rw-r--r--src/couch/client.py21
-rw-r--r--src/couch/feedreader.py10
-rw-r--r--src/couch/resource.py27
-rw-r--r--src/couch/utils.py58
4 files changed, 62 insertions, 54 deletions
diff --git a/src/couch/client.py b/src/couch/client.py
index 188e0de..52477be 100644
--- a/src/couch/client.py
+++ b/src/couch/client.py
@@ -17,7 +17,7 @@ from couch.resource import Resource
DEFAULT_BASE_URL = os.environ.get('COUCHDB_URL', 'http://localhost:5984/')
-def _id_to_path(_id):
+def _id_to_path(_id: str) -> str:
if _id[:1] == "_":
return _id.split("/", 1)
return [_id]
@@ -360,7 +360,7 @@ class Database(object):
revision.
:returns: doc
"""
-
+
_doc = copy.copy(doc)
if "_id" not in _doc:
_doc['_id'] = uuid.uuid4().hex
@@ -371,12 +371,27 @@ class Database(object):
params = {}
data = utils.force_bytes(json.dumps(_doc))
+
+ print("gg1", flush=True)
+ print(data, flush=True)
+ print("vv1", flush=True)
+
(resp, result) = self.resource(_doc['_id']).put(
data=data, params=params)
+ print("gg3", flush=True)
+ print(resp.status_code)
+ print(resp.content)
+ #print(resp.contents)
+
+ print("gg2", flush=True)
+ print(data, flush=True)
+ print(result, flush=True)
+ print("vv2", flush=True)
+
if resp.status_code == 409:
raise exp.Conflict(result['reason'])
-
+
if "rev" in result and result["rev"] is not None:
_doc["_rev"] = result["rev"]
diff --git a/src/couch/feedreader.py b/src/couch/feedreader.py
index e293932..98401ab 100644
--- a/src/couch/feedreader.py
+++ b/src/couch/feedreader.py
@@ -1,13 +1,13 @@
# -*- coding: utf-8 -*-
# Based on py-couchdb (https://github.com/histrio/py-couchdb)
+from __future__ import annotations
-
-class BaseFeedReader(object):
+class BaseFeedReader:
"""
Base interface class for changes feed reader.
"""
- def __call__(self, db):
+ def __call__(self, db) -> BaseFeedReader:
self.db = db
return self
@@ -44,9 +44,9 @@ class SimpleFeedReader(BaseFeedReader):
a valid feed reader interface.
"""
- def __call__(self, db, callback):
+ def __call__(self, db, callback) -> BaseFeedReader:
self.callback = callback
return super(SimpleFeedReader, self).__call__(db)
- def on_message(self, message):
+ def on_message(self, message) -> None:
self.callback(message, db=self.db)
diff --git a/src/couch/resource.py b/src/couch/resource.py
index da1e0dd..364bff4 100644
--- a/src/couch/resource.py
+++ b/src/couch/resource.py
@@ -3,17 +3,20 @@
from __future__ import unicode_literals
+from typing import Union, Tuple
import json
import requests
+
+
from couch import utils
from couch import exceptions
-class Resource(object):
- def __init__(self, base_url, full_commit=True, session=None,
- credentials=None, authmethod="session", verify=False):
+class Resource:
+ def __init__(self, base_url: str, full_commit: bool = True, session: Union[requests.sessions.Session, None] = None,
+ credentials: Union[Tuple[str, str], None] = None, authmethod: str = "session", verify: bool = False) -> None:
self.base_url = base_url
# self.verify = verify
@@ -31,7 +34,7 @@ class Resource(object):
self.session = session
self.session.verify = verify
- def _authenticate(self, credentials, method):
+ def _authenticate(self, credentials: Union[Tuple[str, str], None], method: str) -> None:
if not credentials:
return
@@ -50,11 +53,11 @@ class Resource(object):
else:
raise RuntimeError("Invalid authentication method")
- def __call__(self, *path):
+ def __call__(self, *path: str):
base_url = utils.urljoin(self.base_url, *path)
return self.__class__(base_url, session=self.session)
- def _check_result(self, response, result):
+ def _check_result(self, response, result) -> None:
try:
error = result.get('error', None)
reason = result.get('reason', None)
@@ -74,7 +77,7 @@ class Resource(object):
raise exceptions.BadRequest(reason or "Bad request")
raise exceptions.GenericError(result)
- def request(self, method, path, params=None, data=None,
+ def request(self, method, path: str, params=None, data=None,
headers=None, stream=False, **kwargs):
if headers is None:
@@ -112,17 +115,17 @@ class Resource(object):
return response, result
- def get(self, path=None, **kwargs):
+ def get(self, path: Union[str, None] = None, **kwargs):
return self.request("GET", path, **kwargs)
- def put(self, path=None, **kwargs):
+ def put(self, path: Union[str, None] = None, **kwargs):
return self.request("PUT", path, **kwargs)
- def post(self, path=None, **kwargs):
+ def post(self, path: Union[str, None] = None, **kwargs):
return self.request("POST", path, **kwargs)
- def delete(self, path=None, **kwargs):
+ def delete(self, path: Union[str, None] = None, **kwargs):
return self.request("DELETE", path, **kwargs)
- def head(self, path=None, **kwargs):
+ def head(self, path: Union[str, None] = None, **kwargs):
return self.request("HEAD", path, **kwargs)
diff --git a/src/couch/utils.py b/src/couch/utils.py
index 1cd21d8..f0883a6 100644
--- a/src/couch/utils.py
+++ b/src/couch/utils.py
@@ -1,26 +1,15 @@
# -*- coding: utf-8 -*-
# Based on py-couchdb (https://github.com/histrio/py-couchdb)
-
+from typing import Tuple, Union, Dict, List, Any
import json
import sys
+import requests
+from urllib.parse import unquote as _unquote
+from urllib.parse import urlunsplit, urlsplit
-if sys.version_info[0] == 3:
- from urllib.parse import unquote as _unquote
- from urllib.parse import urlunsplit, urlsplit
-
- string_type = str
- bytes_type = bytes
-
- from functools import reduce
-
-else:
- from urllib import unquote as _unquote
- from urlparse import urlunsplit, urlsplit
-
- string_type = unicode # noqa: F821
- bytes_type = str
+from functools import reduce
URLSPLITTER = '/'
@@ -28,7 +17,7 @@ URLSPLITTER = '/'
json_encoder = json.JSONEncoder()
-def extract_credentials(url):
+def extract_credentials(url: str) -> Tuple[str, Union[Tuple[str, str], None]]:
"""
Extract authentication (user name and password) credentials from the
given URL.
@@ -46,19 +35,20 @@ def extract_credentials(url):
if '@' in netloc:
creds, netloc = netloc.split('@')
credentials = tuple(_unquote(i) for i in creds.split(':'))
- parts = list(parts)
- parts[1] = netloc
- else:
- credentials = None
- return urlunsplit(parts), credentials
+ parts_list = list(parts)
+ parts_list[1] = netloc
+ return urlunsplit(parts_list), (credentials[0], credentials[1])
+
+ parts_list = list(parts)
+ return urlunsplit(parts_list), None
-def _join(head, tail):
+def _join(head: str, tail: str) -> str:
parts = [head.rstrip(URLSPLITTER), tail.lstrip(URLSPLITTER)]
return URLSPLITTER.join(parts)
-def urljoin(base, *path):
+def urljoin(base: str, *path: str) -> str:
"""
Assemble a uri based on a base, any number of path segments, and query
string parameters.
@@ -87,18 +77,18 @@ def urljoin(base, *path):
"""
return reduce(_join, path, base)
-
-def as_json(response):
+# Probably bugs here
+def as_json(response: requests.models.Response) -> Union[Dict[str, Any], None]:
if "application/json" in response.headers['content-type']:
response_src = response.content.decode('utf-8')
if response.content != b'':
- return json.loads(response_src)
+ ret: Dict[str, Any] = json.loads(response_src)
+ return ret
else:
return response_src
return None
-
-def _path_from_name(name, type):
+def _path_from_name(name: str, type: str) -> List[str]:
"""
Expand a 'design/foo' style name to its full path as a list of
segments.
@@ -114,7 +104,7 @@ def _path_from_name(name, type):
return ['_design', design, type, name]
-def encode_view_options(options):
+def encode_view_options(options: Dict[str, Any]) -> Dict[str, Any]:
"""
Encode any items in the options dict that are sent as a JSON string to a
view/list function.
@@ -138,13 +128,13 @@ def encode_view_options(options):
return retval
-def force_bytes(data, encoding="utf-8"):
- if isinstance(data, string_type):
+def force_bytes(data: Union[str, bytes], encoding: str = "utf-8") -> bytes:
+ if isinstance(data, str):
data = data.encode(encoding)
return data
-def force_text(data, encoding="utf-8"):
- if isinstance(data, bytes_type):
+def force_text(data: Union[str, bytes], encoding: str = "utf-8") -> str:
+ if isinstance(data, bytes):
data = data.decode(encoding)
return data