summaryrefslogtreecommitdiff
path: root/requests_cache/models
diff options
context:
space:
mode:
authorJordan Cook <jordan.cook@pioneer.com>2022-04-18 20:07:05 -0500
committerJordan Cook <jordan.cook@pioneer.com>2022-04-19 13:32:16 -0500
commit9224b9936d1c9b57de05b5afd451ad4c65cf8e91 (patch)
tree995f2b7a81a2f815e7562750ac3fa52b0d363b38 /requests_cache/models
parent614cd0b51361b662c7139385239ee920dc3139ff (diff)
downloadrequests-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__.py1
-rw-r--r--requests_cache/models/base.py22
-rw-r--r--requests_cache/models/raw_response.py4
-rw-r--r--requests_cache/models/request.py3
-rwxr-xr-xrequests_cache/models/response.py4
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)