summaryrefslogtreecommitdiff
path: root/requests_cache/models/request.py
diff options
context:
space:
mode:
authorJordan Cook <jordan.cook@pioneer.com>2021-05-10 19:25:38 -0500
committerJordan Cook <jordan.cook@pioneer.com>2021-05-26 20:48:16 -0500
commit2f3cfbf926e2c99919e7a5b02f4926d5dbd67f24 (patch)
tree04dc4232a31aaea8239d382ebdfec7efbad1d5ee /requests_cache/models/request.py
parent865d9825b78d4f4571d5b20990c0c498f2d0ab99 (diff)
downloadrequests-cache-2f3cfbf926e2c99919e7a5b02f4926d5dbd67f24.tar.gz
Split out serializers and models into separate classes
Diffstat (limited to 'requests_cache/models/request.py')
-rw-r--r--requests_cache/models/request.py51
1 files changed, 51 insertions, 0 deletions
diff --git a/requests_cache/models/request.py b/requests_cache/models/request.py
new file mode 100644
index 0000000..d5c1ba1
--- /dev/null
+++ b/requests_cache/models/request.py
@@ -0,0 +1,51 @@
+"""Classes to wrap cached response objects"""
+from logging import getLogger
+from typing import Any
+
+import attr
+from requests import PreparedRequest
+from requests.cookies import RequestsCookieJar
+from requests.structures import CaseInsensitiveDict
+
+from . import dataclass
+
+logger = getLogger(__name__)
+
+
+@dataclass
+class CachedRequest:
+ """A serializable dataclass that emulates :py:class:`requests.PreparedResponse`"""
+
+ body: Any = attr.ib(default=None)
+ cookies: RequestsCookieJar = attr.ib(factory=dict)
+ headers: CaseInsensitiveDict = attr.ib(factory=CaseInsensitiveDict)
+ method: str = attr.ib(default=None)
+ url: str = attr.ib(default=None)
+
+ @classmethod
+ def from_request(cls, original_request: PreparedRequest):
+ """Create a CachedRequest based on an original request object"""
+ kwargs = {k: getattr(original_request, k, None) for k in attr.fields_dict(cls).keys()}
+ # TODO: Better means of handling naming differences between class attrs and method kwargs
+ kwargs['cookies'] = original_request._cookies
+ return cls(**kwargs)
+
+ # TODO: Is this necessary, or will cattr.structure() be sufficient?
+ @classmethod
+ def prepare(self, obj) -> PreparedRequest:
+ """Turn a CachedRequest object back into a PreparedRequest. This lets PreparedRequest do the
+ work of normalizing any values that may have changed during (de)serialization.
+ """
+ req = PreparedRequest()
+ kwargs = attr.asdict(obj)
+ # TODO: Better means of handling naming differences between class attrs and method kwargs
+ kwargs['data'] = kwargs.pop('body')
+ req.prepare(**kwargs)
+ return req
+
+ @property
+ def _cookies(self):
+ return self.cookies
+
+ def __str__(self):
+ return f'{self.method} {self.url}'