diff --git a/izzylib/__init__.py b/izzylib/__init__.py index 20b506d..7dc6d35 100644 --- a/izzylib/__init__.py +++ b/izzylib/__init__.py @@ -29,3 +29,29 @@ from .misc import * from .cache import * from .config import * from .connection import * +from .http_client import ( + HttpClient, + HttpClientRequest, + HttpClientResponse +) + + +def add_builtins(*classes): + new_builtins = [ + BaseConfig, + DotDict, + HttpClient, + JsonConfig, + LruCache, + Path, + TtlCache, + Url, + convert_to_boolean, + convert_to_bytes, + convert_to_string, + logging, + random_gen, + *classes + ] + + __builtins__.update({cls.__name__: cls for cls in new_builtins}) diff --git a/izzylib/http_client/__init__.py b/izzylib/http_client/__init__.py index 4f3cbbb..1fcc7cc 100644 --- a/izzylib/http_client/__init__.py +++ b/izzylib/http_client/__init__.py @@ -23,6 +23,6 @@ http_methods = { } -from .client import Client -from .request import Request -from .response import Response +from .client import HttpClient +from .request import HttpClientRequest +from .response import HttpClientResponse diff --git a/izzylib/http_client/client.py b/izzylib/http_client/client.py index 82b4253..49be56a 100644 --- a/izzylib/http_client/client.py +++ b/izzylib/http_client/client.py @@ -11,8 +11,8 @@ from urllib.request import urlopen from . import http_methods from .config import Config -from .request import Request -from .response import Response +from .request import HttpClientRequest +from .response import HttpClientResponse from .. import izzylog, __version__ from ..dotdict import DefaultDotDict, DotDict @@ -32,7 +32,7 @@ from typing import * __pdoc__ = {f'Client.{method.lower()}': f'Send a {method.upper()} request' for method in http_methods} -class Client: +class HttpClient: 'Basic HTTP client based on `urllib.request.urlopen`' @@ -89,8 +89,8 @@ class Client: setattr(self, method.lower(), partial(self.request, method=method.upper())) - def build_request(self, *args, **kwargs) -> Request: - 'Creates a new Request object. It can be used with `Client.send_request` See `izzylib.http_client.request.Request` for available arguments..' + def build_request(self, *args, **kwargs) -> HttpClientRequest: + 'Creates a new HttpClientRequest object. It can be used with `Client.send_request` See `izzylib.http_client.request.HttpClientRequest` for available arguments..' request = self.cfg.request_class(*args, **kwargs) request._set_params(self.cfg) @@ -98,11 +98,11 @@ class Client: return request - def send_request(self, request: Request) -> Response: + def send_request(self, request: HttpClientRequest) -> HttpClientResponse: 'Sends a request' - if not isinstance(request, Request): - raise TypeError(f'Must be a barkshark_http_async.request.Request object (or subclassed), not {type(request).__name__}') + if not isinstance(request, HttpClientRequest): + raise TypeError(f'Must be a izzylib.http_client.request.HttpClientRequest object (or subclassed), not {type(request).__name__}') if not request._params_set: request._set_params(self.cfg) @@ -116,7 +116,7 @@ class Client: return self.cfg.response_class(response) - def request(self, *args, **kwargs) -> Response: + def request(self, *args, **kwargs) -> HttpClientResponse: 'Create and send a request' request = self.build_request(*args, **kwargs) diff --git a/izzylib/http_client/config.py b/izzylib/http_client/config.py index 0dea173..607b0bf 100644 --- a/izzylib/http_client/config.py +++ b/izzylib/http_client/config.py @@ -1,5 +1,5 @@ -from .request import Request -from .response import Response +from .request import HttpClientRequest +from .response import HttpClientResponse from .. import __version__ from ..config import BaseConfig diff --git a/izzylib/http_client/request.py b/izzylib/http_client/request.py index 430de60..9803fef 100644 --- a/izzylib/http_client/request.py +++ b/izzylib/http_client/request.py @@ -12,7 +12,7 @@ try: import magic except ImportError: magic = None -class Request(PyRequest): +class HttpClientRequest(PyRequest): def __init__(self, url:str, body:bytes=None, headers:dict={}, cookies:dict={}, method:str='GET'): 'An HTTP request. Headers can be accessed, set, or deleted as dict items.' @@ -81,7 +81,7 @@ class Request(PyRequest): @property def data(self): - 'Alias for `Request.body`' + 'Alias for `HttpClientRequest.body`' return self._data @@ -183,7 +183,7 @@ class Request(PyRequest): def set_type_from_body(self) -> str: - 'Set the `Content-Type` header based on `Request.body` and return the mimetype.' + 'Set the `Content-Type` header based on `HttpClientRequest.body` and return the mimetype.' if not self.body: return diff --git a/izzylib/http_client/response.py b/izzylib/http_client/response.py index 944d184..a892f54 100644 --- a/izzylib/http_client/response.py +++ b/izzylib/http_client/response.py @@ -5,7 +5,7 @@ from ..http_utils import Cookies, Headers from ..misc import Url -class Response: +class HttpClientResponse: headers = None cookies = None diff --git a/izzylib/mastodon.py b/izzylib/mastodon.py index 5a70df7..d53e2e9 100644 --- a/izzylib/mastodon.py +++ b/izzylib/mastodon.py @@ -4,7 +4,7 @@ from . import __version__ from .config import BaseConfig from .dotdict import DotDict from .exceptions import HttpError -from .http_client import Client +from .http_client import HttpClient from .misc import DateString, Url diff --git a/izzylib/misc.py b/izzylib/misc.py index 14856a0..e2c1750 100644 --- a/izzylib/misc.py +++ b/izzylib/misc.py @@ -34,6 +34,7 @@ __all__ = [ 'class_name', 'convert_to_boolean', 'convert_to_bytes', + 'convert_to_string', 'get_current_user_info', 'get_ip', 'hasher', @@ -174,19 +175,31 @@ def convert_to_bytes(data:Union[str,DotDict,dict,list,set,tuple,bytearray,bytes] if not data: return b'' - if isinstance(data, str): - return data.encode('utf-8') - - elif isinstance(data, DotDict): - return data.to_json().encode('utf-8') - - elif any(map(isinstance, [data], [dict, list, set, tuple])): - return json.dumps(data).encode('utf-8') - - elif isinstance(data, bytearray): + if isinstance(data, bytearray): return bytes(data) elif not isinstance(data, bytes): + return convert_to_string(data).encode('utf-8') + + return data + + +def convert_to_string(data:Union[str,DotDict,dict,list,set,tuple,bytearray,bytes]) -> str: + 'Attempt to convert an object to a str.' + + if not data: + return '' + + if isinstance(data, DotDict): + return data.to_json() + + elif isinstance(data, (dict, list, set, tuple)): + return json.dumps(data) + + elif isinstance(data, (bytes, bytearray)): + return data.decode('utf-8') + + elif not isinstance(data, str): raise TypeError(f'Invalid data type: {class_name(data)}') return data