diff options
| author | Jordan Cook <jordan.cook@pioneer.com> | 2021-05-10 19:25:38 -0500 |
|---|---|---|
| committer | Jordan Cook <jordan.cook@pioneer.com> | 2021-05-26 20:48:16 -0500 |
| commit | 2f3cfbf926e2c99919e7a5b02f4926d5dbd67f24 (patch) | |
| tree | 04dc4232a31aaea8239d382ebdfec7efbad1d5ee /requests_cache/models/request.py | |
| parent | 865d9825b78d4f4571d5b20990c0c498f2d0ab99 (diff) | |
| download | requests-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.py | 51 |
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}' |
