fast-cache-middleware 0.0.1__py3-none-any.whl → 0.0.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- fast_cache_middleware/__init__.py +35 -34
- fast_cache_middleware/controller.py +231 -231
- fast_cache_middleware/depends.py +66 -66
- fast_cache_middleware/exceptions.py +6 -6
- fast_cache_middleware/middleware.py +306 -293
- fast_cache_middleware/schemas.py +21 -21
- fast_cache_middleware/serializers.py +92 -92
- fast_cache_middleware/storages.py +238 -238
- {fast_cache_middleware-0.0.1.dist-info → fast_cache_middleware-0.0.3.dist-info}/METADATA +3 -2
- fast_cache_middleware-0.0.3.dist-info/RECORD +11 -0
- fast_cache_middleware-0.0.1.dist-info/RECORD +0 -11
- {fast_cache_middleware-0.0.1.dist-info → fast_cache_middleware-0.0.3.dist-info}/WHEEL +0 -0
fast_cache_middleware/schemas.py
CHANGED
@@ -1,21 +1,21 @@
|
|
1
|
-
import typing as tp
|
2
|
-
|
3
|
-
from starlette.routing import Route
|
4
|
-
|
5
|
-
from .depends import BaseCacheConfigDepends
|
6
|
-
|
7
|
-
|
8
|
-
class RouteInfo:
|
9
|
-
"""Route information with cache configuration."""
|
10
|
-
|
11
|
-
def __init__(
|
12
|
-
self,
|
13
|
-
route: Route,
|
14
|
-
cache_config: tp.Optional[BaseCacheConfigDepends] = None,
|
15
|
-
cache_drop_config: tp.Optional[BaseCacheConfigDepends] = None,
|
16
|
-
):
|
17
|
-
self.route = route
|
18
|
-
self.cache_config = cache_config
|
19
|
-
self.cache_drop_config = cache_drop_config
|
20
|
-
self.path: str = getattr(route, "path")
|
21
|
-
self.methods: tp.Set[str] = getattr(route, "methods", set())
|
1
|
+
import typing as tp
|
2
|
+
|
3
|
+
from starlette.routing import Route
|
4
|
+
|
5
|
+
from .depends import BaseCacheConfigDepends
|
6
|
+
|
7
|
+
|
8
|
+
class RouteInfo:
|
9
|
+
"""Route information with cache configuration."""
|
10
|
+
|
11
|
+
def __init__(
|
12
|
+
self,
|
13
|
+
route: Route,
|
14
|
+
cache_config: tp.Optional[BaseCacheConfigDepends] = None,
|
15
|
+
cache_drop_config: tp.Optional[BaseCacheConfigDepends] = None,
|
16
|
+
):
|
17
|
+
self.route = route
|
18
|
+
self.cache_config = cache_config
|
19
|
+
self.cache_drop_config = cache_drop_config
|
20
|
+
self.path: str = getattr(route, "path")
|
21
|
+
self.methods: tp.Set[str] = getattr(route, "methods", set())
|
@@ -1,92 +1,92 @@
|
|
1
|
-
import json
|
2
|
-
import typing as tp
|
3
|
-
|
4
|
-
from starlette.requests import Request
|
5
|
-
from starlette.responses import Response
|
6
|
-
|
7
|
-
# Define types for metadata and stored response
|
8
|
-
Metadata: tp.TypeAlias = tp.Dict[str, tp.Any] # todo: make it models
|
9
|
-
StoredResponse: tp.TypeAlias = tp.Tuple[Response, Request, Metadata]
|
10
|
-
|
11
|
-
|
12
|
-
class BaseSerializer:
|
13
|
-
def dumps(
|
14
|
-
self, response: Response, request: Request, metadata: Metadata
|
15
|
-
) -> tp.Union[str, bytes]:
|
16
|
-
raise NotImplementedError()
|
17
|
-
|
18
|
-
def loads(
|
19
|
-
self, data: tp.Union[str, bytes]
|
20
|
-
) -> tp.Tuple[Response, Request, Metadata]:
|
21
|
-
raise NotImplementedError()
|
22
|
-
|
23
|
-
@property
|
24
|
-
def is_binary(self) -> bool:
|
25
|
-
raise NotImplementedError()
|
26
|
-
|
27
|
-
|
28
|
-
class JSONSerializer(BaseSerializer):
|
29
|
-
def dumps(self, response: Response, request: Request, metadata: Metadata) -> str:
|
30
|
-
serialized = {
|
31
|
-
"response": {
|
32
|
-
"status_code": response.status_code,
|
33
|
-
"headers": [[k.decode(), v.decode()] for k, v in response.headers.raw],
|
34
|
-
"content": (
|
35
|
-
response.body.decode("utf-8", errors="ignore")
|
36
|
-
if response.body
|
37
|
-
else None
|
38
|
-
),
|
39
|
-
},
|
40
|
-
"request": {
|
41
|
-
"method": request.method,
|
42
|
-
"url": str(request.url),
|
43
|
-
"headers": [[k.decode(), v.decode()] for k, v in request.headers.raw],
|
44
|
-
},
|
45
|
-
"metadata": metadata,
|
46
|
-
}
|
47
|
-
return json.dumps(serialized)
|
48
|
-
|
49
|
-
def loads(self, data: tp.Union[str, bytes]) -> StoredResponse:
|
50
|
-
if isinstance(data, bytes):
|
51
|
-
data = data.decode()
|
52
|
-
|
53
|
-
parsed = json.loads(data)
|
54
|
-
|
55
|
-
# Restore Response
|
56
|
-
response_data = parsed["response"]
|
57
|
-
response = Response(
|
58
|
-
content=(
|
59
|
-
response_data["content"].encode("utf-8")
|
60
|
-
if response_data["content"]
|
61
|
-
else b""
|
62
|
-
),
|
63
|
-
status_code=response_data["status_code"],
|
64
|
-
headers=dict(response_data["headers"]),
|
65
|
-
)
|
66
|
-
|
67
|
-
# Restore Request - create mock object for compatibility
|
68
|
-
request_data = parsed["request"]
|
69
|
-
|
70
|
-
# Create minimal scope for Request
|
71
|
-
from urllib.parse import urlparse
|
72
|
-
|
73
|
-
parsed_url = urlparse(request_data["url"])
|
74
|
-
scope = {
|
75
|
-
"type": "http",
|
76
|
-
"method": request_data["method"],
|
77
|
-
"path": parsed_url.path,
|
78
|
-
"query_string": parsed_url.query.encode() if parsed_url.query else b"",
|
79
|
-
"headers": [[k.encode(), v.encode()] for k, v in request_data["headers"]],
|
80
|
-
}
|
81
|
-
|
82
|
-
# Create empty receive function
|
83
|
-
async def receive():
|
84
|
-
return {"type": "http.request", "body": b""}
|
85
|
-
|
86
|
-
request = Request(scope, receive)
|
87
|
-
|
88
|
-
return response, request, parsed["metadata"]
|
89
|
-
|
90
|
-
@property
|
91
|
-
def is_binary(self) -> bool:
|
92
|
-
return False
|
1
|
+
import json
|
2
|
+
import typing as tp
|
3
|
+
|
4
|
+
from starlette.requests import Request
|
5
|
+
from starlette.responses import Response
|
6
|
+
|
7
|
+
# Define types for metadata and stored response
|
8
|
+
Metadata: tp.TypeAlias = tp.Dict[str, tp.Any] # todo: make it models
|
9
|
+
StoredResponse: tp.TypeAlias = tp.Tuple[Response, Request, Metadata]
|
10
|
+
|
11
|
+
|
12
|
+
class BaseSerializer:
|
13
|
+
def dumps(
|
14
|
+
self, response: Response, request: Request, metadata: Metadata
|
15
|
+
) -> tp.Union[str, bytes]:
|
16
|
+
raise NotImplementedError()
|
17
|
+
|
18
|
+
def loads(
|
19
|
+
self, data: tp.Union[str, bytes]
|
20
|
+
) -> tp.Tuple[Response, Request, Metadata]:
|
21
|
+
raise NotImplementedError()
|
22
|
+
|
23
|
+
@property
|
24
|
+
def is_binary(self) -> bool:
|
25
|
+
raise NotImplementedError()
|
26
|
+
|
27
|
+
|
28
|
+
class JSONSerializer(BaseSerializer):
|
29
|
+
def dumps(self, response: Response, request: Request, metadata: Metadata) -> str:
|
30
|
+
serialized = {
|
31
|
+
"response": {
|
32
|
+
"status_code": response.status_code,
|
33
|
+
"headers": [[k.decode(), v.decode()] for k, v in response.headers.raw],
|
34
|
+
"content": (
|
35
|
+
response.body.decode("utf-8", errors="ignore")
|
36
|
+
if response.body
|
37
|
+
else None
|
38
|
+
),
|
39
|
+
},
|
40
|
+
"request": {
|
41
|
+
"method": request.method,
|
42
|
+
"url": str(request.url),
|
43
|
+
"headers": [[k.decode(), v.decode()] for k, v in request.headers.raw],
|
44
|
+
},
|
45
|
+
"metadata": metadata,
|
46
|
+
}
|
47
|
+
return json.dumps(serialized)
|
48
|
+
|
49
|
+
def loads(self, data: tp.Union[str, bytes]) -> StoredResponse:
|
50
|
+
if isinstance(data, bytes):
|
51
|
+
data = data.decode()
|
52
|
+
|
53
|
+
parsed = json.loads(data)
|
54
|
+
|
55
|
+
# Restore Response
|
56
|
+
response_data = parsed["response"]
|
57
|
+
response = Response(
|
58
|
+
content=(
|
59
|
+
response_data["content"].encode("utf-8")
|
60
|
+
if response_data["content"]
|
61
|
+
else b""
|
62
|
+
),
|
63
|
+
status_code=response_data["status_code"],
|
64
|
+
headers=dict(response_data["headers"]),
|
65
|
+
)
|
66
|
+
|
67
|
+
# Restore Request - create mock object for compatibility
|
68
|
+
request_data = parsed["request"]
|
69
|
+
|
70
|
+
# Create minimal scope for Request
|
71
|
+
from urllib.parse import urlparse
|
72
|
+
|
73
|
+
parsed_url = urlparse(request_data["url"])
|
74
|
+
scope = {
|
75
|
+
"type": "http",
|
76
|
+
"method": request_data["method"],
|
77
|
+
"path": parsed_url.path,
|
78
|
+
"query_string": parsed_url.query.encode() if parsed_url.query else b"",
|
79
|
+
"headers": [[k.encode(), v.encode()] for k, v in request_data["headers"]],
|
80
|
+
}
|
81
|
+
|
82
|
+
# Create empty receive function
|
83
|
+
async def receive():
|
84
|
+
return {"type": "http.request", "body": b""}
|
85
|
+
|
86
|
+
request = Request(scope, receive)
|
87
|
+
|
88
|
+
return response, request, parsed["metadata"]
|
89
|
+
|
90
|
+
@property
|
91
|
+
def is_binary(self) -> bool:
|
92
|
+
return False
|