new add_builtins function and rename http_client classes

This commit is contained in:
Izalia Mae 2022-03-04 04:43:20 -05:00
parent cdd35cef6e
commit e349945918
8 changed files with 68 additions and 29 deletions

View file

@ -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})

View file

@ -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

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -5,7 +5,7 @@ from ..http_utils import Cookies, Headers
from ..misc import Url
class Response:
class HttpClientResponse:
headers = None
cookies = None

View file

@ -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

View file

@ -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