diff --git a/stockcli/utils.py b/stockcli/utils.py new file mode 100644 --- /dev/null +++ b/stockcli/utils.py @@ -0,0 +1,64 @@ +import logging +import string +from operator import attrgetter +from typing import Any, Optional + +import click +import requests + +from .console import error_console + +UNALLOWED_CHARACTERS = str.maketrans(dict((c, None) for c in string.whitespace)) + + +def make_request(method: str, url_path: str, data: Optional[Any] = None) -> Any: + obj = click.get_current_context().obj + session = obj["request_session"] + base_url = obj["base_url"] + requested_url = base_url + url_path + + method_function = attrgetter(method) + + try: + if data is not None: + response = method_function(session)(requested_url, json=data) + else: + response = method_function(session)(requested_url) + response.raise_for_status() + except requests.Timeout: + logging.error(f"The connection to {requested_url} timed out!") + error_console.print("Connection timed out!") + raise + except requests.ConnectionError: + logging.error(f"Couldn't establish a connection to {requested_url}!") + error_console.print("Couldn't establish a connection!") + raise + except requests.HTTPError: + logging.error(f"{requested_url} sent back an HTTPError") + error_console.print("Got the following error:") + error_message = response.json()["error_message"] + logging.error(error_message) + error_console.print(error_message) + raise + except requests.TooManyRedirects: + logging.error(f"{requested_url} had too many redirects!") + error_console.print("Too many redirects!") + raise + else: + return response.json() + + +def get_request(url_path: str) -> Any: + return make_request("get", url_path) + + +def post_request(url_path: str, data: dict[str, Any]) -> Any: + return make_request("post", url_path, data) + + +def put_request(url_path: str, data: dict[str, Any]) -> Any: + return make_request("put", url_path, data) + + +def prepare_barcode(barcode: str) -> str: + return barcode.translate(UNALLOWED_CHARACTERS)