diff options
author | Jordan Cook <jordan.cook@pioneer.com> | 2022-04-18 20:07:05 -0500 |
---|---|---|
committer | Jordan Cook <jordan.cook@pioneer.com> | 2022-04-19 13:32:16 -0500 |
commit | 9224b9936d1c9b57de05b5afd451ad4c65cf8e91 (patch) | |
tree | 995f2b7a81a2f815e7562750ac3fa52b0d363b38 /requests_cache/models | |
parent | 614cd0b51361b662c7139385239ee920dc3139ff (diff) | |
download | requests-cache-9224b9936d1c9b57de05b5afd451ad4c65cf8e91.tar.gz |
Improve output for all models when printed or logged with rich
Diffstat (limited to 'requests_cache/models')
-rw-r--r-- | requests_cache/models/__init__.py | 1 | ||||
-rw-r--r-- | requests_cache/models/base.py | 22 | ||||
-rw-r--r-- | requests_cache/models/raw_response.py | 4 | ||||
-rw-r--r-- | requests_cache/models/request.py | 3 | ||||
-rwxr-xr-x | requests_cache/models/response.py | 4 |
5 files changed, 30 insertions, 4 deletions
diff --git a/requests_cache/models/__init__.py b/requests_cache/models/__init__.py index 1824a6c..28825bc 100644 --- a/requests_cache/models/__init__.py +++ b/requests_cache/models/__init__.py @@ -4,6 +4,7 @@ from typing import Union from requests import PreparedRequest, Request, Response +from .base import RichMixin from .raw_response import CachedHTTPResponse from .request import CachedRequest from .response import CachedResponse, OriginalResponse diff --git a/requests_cache/models/base.py b/requests_cache/models/base.py new file mode 100644 index 0000000..c2caab5 --- /dev/null +++ b/requests_cache/models/base.py @@ -0,0 +1,22 @@ +from datetime import datetime + +from attr import Factory + + +class RichMixin: + """Mixin that customizes output when pretty-printed with rich. Compared to default rich behavior + for attrs classes, this does the following: + + * Inform rich about all default values so they will be excluded from output + * Handle default value factories + * Stringify datetime objects + * Does not currently handle positional-only args (since we don't currently have any) + """ + + def __rich_repr__(self): + public_attrs = [a for a in self.__attrs_attrs__ if a.repr] + for a in public_attrs: + default = a.default.factory() if isinstance(a.default, Factory) else a.default + value = getattr(self, a.name) + value = str(value) if isinstance(value, datetime) else value + yield a.name, value, default diff --git a/requests_cache/models/raw_response.py b/requests_cache/models/raw_response.py index 96d586d..27f871f 100644 --- a/requests_cache/models/raw_response.py +++ b/requests_cache/models/raw_response.py @@ -10,11 +10,13 @@ from urllib3.response import ( # type: ignore # import location false positive is_fp_closed, ) +from . import RichMixin + logger = getLogger(__name__) @define(auto_attribs=False, slots=False) -class CachedHTTPResponse(HTTPResponse): +class CachedHTTPResponse(HTTPResponse, RichMixin): """A serializable dataclass that emulates :py:class:`~urllib3.response.HTTPResponse`. Supports streaming requests and generator usage. diff --git a/requests_cache/models/request.py b/requests_cache/models/request.py index 935c249..d08ada1 100644 --- a/requests_cache/models/request.py +++ b/requests_cache/models/request.py @@ -6,12 +6,13 @@ from requests.cookies import RequestsCookieJar from requests.structures import CaseInsensitiveDict from ..cache_keys import encode +from . import RichMixin logger = getLogger(__name__) @define(auto_attribs=False) -class CachedRequest: +class CachedRequest(RichMixin): """A serializable dataclass that emulates :py:class:`requests.PreparedResponse`""" body: bytes = field(default=None, converter=encode) diff --git a/requests_cache/models/response.py b/requests_cache/models/response.py index 4e2643b..c667856 100755 --- a/requests_cache/models/response.py +++ b/requests_cache/models/response.py @@ -12,7 +12,7 @@ from requests.structures import CaseInsensitiveDict from urllib3._collections import HTTPHeaderDict from ..policy.expiration import ExpirationTime, get_expiration_datetime -from . import CachedHTTPResponse, CachedRequest +from . import CachedHTTPResponse, CachedRequest, RichMixin if TYPE_CHECKING: from ..policy.actions import CacheActions @@ -57,7 +57,7 @@ class OriginalResponse(BaseResponse): @define(auto_attribs=False, slots=False) -class CachedResponse(BaseResponse): +class CachedResponse(BaseResponse, RichMixin): """A class that emulates :py:class:`requests.Response`, optimized for serialization""" _content: bytes = field(default=None) |