diff options
author | Victor Näslund <victor@sunet.se> | 2022-11-01 01:55:25 +0100 |
---|---|---|
committer | Victor Näslund <victor@sunet.se> | 2022-11-01 01:55:25 +0100 |
commit | ffb26f4a81a9ca61c4105df037f7e1beb8dc5fb0 (patch) | |
tree | 41094f051edbf300a6cd2c2de8dfb8435bfc18a4 /src/couch | |
parent | 1b836e78db2737ba5d1ae43da9828601a5a5c114 (diff) |
initial fresh up
Diffstat (limited to 'src/couch')
-rw-r--r-- | src/couch/client.py | 21 | ||||
-rw-r--r-- | src/couch/feedreader.py | 10 | ||||
-rw-r--r-- | src/couch/resource.py | 27 | ||||
-rw-r--r-- | src/couch/utils.py | 58 |
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 |