diff options
| author | Parker Hancock <633163+parkerhancock@users.noreply.github.com> | 2021-06-14 16:36:17 -0500 |
|---|---|---|
| committer | Parker Hancock <633163+parkerhancock@users.noreply.github.com> | 2021-06-14 16:36:17 -0500 |
| commit | 3e46d619d73e9e733567d1ad2d3f55bbc114dec9 (patch) | |
| tree | 37d5acd5eee8f4f4920f755ec8909732080f05fc /requests_cache/backends | |
| parent | 0ba71d989671614690ed7cc3a09b42bd4ccfaeff (diff) | |
| download | requests-cache-3e46d619d73e9e733567d1ad2d3f55bbc114dec9.tar.gz | |
initial serialization pipeline refactor
Diffstat (limited to 'requests_cache/backends')
| -rw-r--r-- | requests_cache/backends/base.py | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/requests_cache/backends/base.py b/requests_cache/backends/base.py index e3682e3..dd31e0e 100644 --- a/requests_cache/backends/base.py +++ b/requests_cache/backends/base.py @@ -3,7 +3,7 @@ import warnings from abc import ABC from collections.abc import MutableMapping from datetime import datetime -from logging import DEBUG, WARNING, getLogger +from logging import getLogger from typing import Iterable, Iterator, Tuple, Union import requests @@ -12,7 +12,7 @@ from requests.models import PreparedRequest from ..cache_control import ExpirationTime from ..cache_keys import create_key, remove_ignored_params, url_to_key from ..models.response import AnyResponse, CachedResponse -from ..serializers import init_serializer +from ..serializers import SERIALIZERS # Specific exceptions that may be raised during deserialization DESERIALIZE_ERRORS = (AttributeError, TypeError, ValueError, pickle.PickleError) @@ -212,20 +212,31 @@ class BaseStorage(MutableMapping, ABC): serializer: Custom serializer that provides ``loads`` and ``dumps`` methods """ + DEFAULT_SERIALIZER = 'pickle' + def __init__( self, - secret_key: Union[Iterable, str, bytes] = None, - salt: Union[str, bytes] = None, - suppress_warnings: bool = False, serializer=None, + suppress_warnings: bool = False, **kwargs, ): - self.serializer = init_serializer(serializer, secret_key=secret_key, salt=salt) - logger.debug(f'Initializing {type(self).__name__} with serializer: {self.serializer}') + serializer = serializer or self.DEFAULT_SERIALIZER + + if "secret_key" in kwargs and serializer == 'pickle': + serializer = 'safe_pickle' - if not secret_key: - level = DEBUG if suppress_warnings else WARNING - logger.log(level, 'Using a secret key is recommended for this backend') + if isinstance(serializer, str): + self.serializer = SERIALIZERS[serializer] + + if callable(self.serializer): + self.serializer = self.serializer(**kwargs) + + if not is_serializer(self.serializer): + breakpoint() + raise ValueError( + f"Selected serializer {self.serializer} is not a serializer. Must have dumps/loads/is_binary" + ) + logger.debug(f'Initializing {type(self).__name__} with serializer: {self.serializer}') def bulk_delete(self, keys: Iterable[str]): """Delete multiple keys from the cache. Does not raise errors for missing keys. This is a @@ -240,3 +251,8 @@ class BaseStorage(MutableMapping, ABC): def __str__(self): return str(list(self.keys())) + + +def is_serializer(obj): + # Checks if a proposed serializer has these three required attributes + return hasattr(obj, 'dumps') and hasattr(obj, 'loads') and hasattr(obj, "is_binary") |
