summaryrefslogtreecommitdiff
path: root/src/couch/resource.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/couch/resource.py')
-rw-r--r--src/couch/resource.py139
1 files changed, 0 insertions, 139 deletions
diff --git a/src/couch/resource.py b/src/couch/resource.py
deleted file mode 100644
index f110c8d..0000000
--- a/src/couch/resource.py
+++ /dev/null
@@ -1,139 +0,0 @@
-# -*- coding: utf-8 -*-
-# Based on py-couchdb (https://github.com/histrio/py-couchdb)
-
-from __future__ import annotations
-from __future__ import unicode_literals
-from typing import Union, Tuple, Dict, Any
-
-import json
-import requests
-
-from .utils import (
- urljoin,
- as_json,
- force_bytes,
-)
-from .exceptions import (
- GenericError,
- NotFound,
- BadRequest,
- Conflict,
- AuthenticationFailed,
-)
-
-
-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
-
- if not session:
- self.session = requests.session()
-
- self.session.headers.update({"accept": "application/json",
- "content-type": "application/json"})
- self._authenticate(credentials, authmethod)
-
- if not full_commit:
- self.session.headers.update({'X-Couch-Full-Commit': 'false'})
- else:
- self.session = session
- self.session.verify = verify
-
- def _authenticate(self, credentials: Union[Tuple[str, str], None], method: str) -> None:
- if not credentials:
- return
-
- if method == "session":
- data = {"name": credentials[0], "password": credentials[1]}
-
- post_url = urljoin(self.base_url, "_session")
- r = self.session.post(post_url, data=force_bytes(json.dumps(data)))
- if r and r.status_code != 200:
- raise AuthenticationFailed()
-
- elif method == "basic":
- self.session.auth = credentials
-
- else:
- raise RuntimeError("Invalid authentication method")
-
- def __call__(self, *path: str) -> Resource:
- base_url = urljoin(self.base_url, *path)
- return self.__class__(base_url, session=self.session)
-
- def _check_result(self, response, result) -> None:
- try:
- error = result.get('error', None)
- reason = result.get('reason', None)
- except AttributeError:
- error = None
- reason = ''
-
- # This is here because couchdb can return http 201
- # but containing a list of conflict errors
- if error == 'conflict' or error == "file_exists":
- raise Conflict(reason or "Conflict")
-
- if response.status_code > 205:
- if response.status_code == 404 or error == 'not_found':
- raise NotFound(reason or 'Not found')
- elif error == 'bad_request':
- raise BadRequest(reason or "Bad request")
- raise GenericError(result)
-
-
- def request(self, method, path: Union[str, None], params=None, data=None,
- headers=None, stream=False, **kwargs) -> Tuple[requests.models.Response, Union[Dict[str, Any], None]]:
-
- if headers is None:
- headers = {}
-
- headers.setdefault('Accept', 'application/json')
-
- if path:
- if not isinstance(path, (list, tuple)):
- path = [path]
- url = urljoin(self.base_url, *path)
- else:
- url = self.base_url
-
- response = self.session.request(method, url, stream=stream,
- data=data, params=params,
- headers=headers, **kwargs)
- # Ignore result validation if
- # request is with stream mode
-
- if stream and response.status_code < 400:
- result = None
- self._check_result(response, result)
- else:
- result = as_json(response)
-
- if result is None:
- return response, result
-
- if isinstance(result, list):
- for res in result:
- self._check_result(response, res)
- else:
- self._check_result(response, result)
-
- return response, result
-
- def get(self, path: Union[str, None] = None, **kwargs: Any) -> Tuple[requests.models.Response, Union[Dict[str, Any], None]]:
- return self.request("GET", path, **kwargs)
-
- def put(self, path: Union[str, None] = None, **kwargs: Any) -> Tuple[requests.models.Response, Union[Dict[str, Any], None]]:
- return self.request("PUT", path, **kwargs)
-
- def post(self, path: Union[str, None] = None, **kwargs: Any) -> Tuple[requests.models.Response, Union[Dict[str, Any], None]]:
- return self.request("POST", path, **kwargs)
-
- def delete(self, path: Union[str, None] = None, **kwargs: Any) -> Tuple[requests.models.Response, Union[Dict[str, Any], None]]:
- return self.request("DELETE", path, **kwargs)
-
- def head(self, path: Union[str, None] = None, **kwargs: Any) -> Tuple[requests.models.Response, Union[Dict[str, Any], None]]:
- return self.request("HEAD", path, **kwargs)