summaryrefslogtreecommitdiff
path: root/requests_cache/backends
diff options
context:
space:
mode:
authorParker Hancock <633163+parkerhancock@users.noreply.github.com>2021-06-14 16:36:17 -0500
committerParker Hancock <633163+parkerhancock@users.noreply.github.com>2021-06-14 16:36:17 -0500
commit3e46d619d73e9e733567d1ad2d3f55bbc114dec9 (patch)
tree37d5acd5eee8f4f4920f755ec8909732080f05fc /requests_cache/backends
parent0ba71d989671614690ed7cc3a09b42bd4ccfaeff (diff)
downloadrequests-cache-3e46d619d73e9e733567d1ad2d3f55bbc114dec9.tar.gz
initial serialization pipeline refactor
Diffstat (limited to 'requests_cache/backends')
-rw-r--r--requests_cache/backends/base.py36
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")