fastapi-cachex 0.1.0__tar.gz → 0.1.2__tar.gz

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.

Potentially problematic release.


This version of fastapi-cachex might be problematic. Click here for more details.

Files changed (25) hide show
  1. fastapi_cachex-0.1.2/PKG-INFO +172 -0
  2. fastapi_cachex-0.1.0/PKG-INFO → fastapi_cachex-0.1.2/README.md +45 -15
  3. {fastapi_cachex-0.1.0 → fastapi_cachex-0.1.2}/fastapi_cachex/backends/__init__.py +1 -0
  4. fastapi_cachex-0.1.2/fastapi_cachex/backends/memcached.py +74 -0
  5. {fastapi_cachex-0.1.0 → fastapi_cachex-0.1.2}/fastapi_cachex/proxy.py +9 -3
  6. fastapi_cachex-0.1.2/fastapi_cachex.egg-info/PKG-INFO +172 -0
  7. {fastapi_cachex-0.1.0 → fastapi_cachex-0.1.2}/fastapi_cachex.egg-info/SOURCES.txt +3 -1
  8. fastapi_cachex-0.1.2/fastapi_cachex.egg-info/requires.txt +5 -0
  9. {fastapi_cachex-0.1.0 → fastapi_cachex-0.1.2}/pyproject.toml +32 -4
  10. fastapi_cachex-0.1.2/tests/test_proxybackend.py +101 -0
  11. fastapi_cachex-0.1.0/README.md +0 -100
  12. fastapi_cachex-0.1.0/fastapi_cachex.egg-info/PKG-INFO +0 -111
  13. fastapi_cachex-0.1.0/fastapi_cachex.egg-info/requires.txt +0 -2
  14. {fastapi_cachex-0.1.0 → fastapi_cachex-0.1.2}/LICENSE +0 -0
  15. {fastapi_cachex-0.1.0 → fastapi_cachex-0.1.2}/fastapi_cachex/__init__.py +0 -0
  16. {fastapi_cachex-0.1.0 → fastapi_cachex-0.1.2}/fastapi_cachex/backends/base.py +0 -0
  17. {fastapi_cachex-0.1.0 → fastapi_cachex-0.1.2}/fastapi_cachex/backends/memory.py +0 -0
  18. {fastapi_cachex-0.1.0 → fastapi_cachex-0.1.2}/fastapi_cachex/cache.py +0 -0
  19. {fastapi_cachex-0.1.0 → fastapi_cachex-0.1.2}/fastapi_cachex/directives.py +0 -0
  20. {fastapi_cachex-0.1.0 → fastapi_cachex-0.1.2}/fastapi_cachex/exceptions.py +0 -0
  21. {fastapi_cachex-0.1.0 → fastapi_cachex-0.1.2}/fastapi_cachex/types.py +0 -0
  22. {fastapi_cachex-0.1.0 → fastapi_cachex-0.1.2}/fastapi_cachex.egg-info/dependency_links.txt +0 -0
  23. {fastapi_cachex-0.1.0 → fastapi_cachex-0.1.2}/fastapi_cachex.egg-info/top_level.txt +0 -0
  24. {fastapi_cachex-0.1.0 → fastapi_cachex-0.1.2}/setup.cfg +0 -0
  25. {fastapi_cachex-0.1.0 → fastapi_cachex-0.1.2}/tests/test_cache.py +0 -0
@@ -0,0 +1,172 @@
1
+ Metadata-Version: 2.4
2
+ Name: fastapi-cachex
3
+ Version: 0.1.2
4
+ Summary: A caching library for FastAPI with support for Cache-Control, ETag, and multiple backends.
5
+ Author-email: Allen <s96016641@gmail.com>
6
+ License-Expression: Apache-2.0
7
+ Project-URL: Homepage, https://github.com/allen0099/FastAPI-CacheX
8
+ Project-URL: Repository, https://github.com/allen0099/FastAPI-CacheX.git
9
+ Project-URL: Issues, https://github.com/allen0099/FastAPI-CacheX/issues
10
+ Keywords: fastapi,cache,etag,cache-control,redis,memcached,in-memory
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: Programming Language :: Python
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Programming Language :: Python :: 3 :: Only
20
+ Classifier: Framework :: FastAPI
21
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
22
+ Classifier: Topic :: Internet :: WWW/HTTP :: HTTP Servers
23
+ Requires-Python: >=3.10
24
+ Description-Content-Type: text/markdown
25
+ License-File: LICENSE
26
+ Requires-Dist: fastapi
27
+ Requires-Dist: httpx
28
+ Provides-Extra: memcache
29
+ Requires-Dist: pymemcache; extra == "memcache"
30
+ Dynamic: license-file
31
+
32
+ # FastAPI-Cache X
33
+
34
+ [![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)
35
+ [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
36
+ [![Tests](https://github.com/allen0099/FastAPI-CacheX/actions/workflows/test.yml/badge.svg)](https://github.com/allen0099/FastAPI-CacheX/actions/workflows/test.yml)
37
+ [![Coverage Status](https://raw.githubusercontent.com/allen0099/FastAPI-CacheX/coverage-badge/coverage.svg)](https://github.com/allen0099/FastAPI-CacheX/actions/workflows/test.yml)
38
+
39
+ [![Downloads](https://static.pepy.tech/badge/fastapi-cachex)](https://pepy.tech/project/fastapi-cachex)
40
+ [![Weekly downloads](https://static.pepy.tech/badge/fastapi-cachex/week)](https://pepy.tech/project/fastapi-cachex)
41
+ [![Monthly downloads](https://static.pepy.tech/badge/fastapi-cachex/month)](https://pepy.tech/project/fastapi-cachex)
42
+
43
+ [![PyPI version](https://img.shields.io/pypi/v/fastapi-cachex.svg?logo=pypi&logoColor=gold&label=PyPI)](https://pypi.org/project/fastapi-cachex)
44
+ [![Python Versions](https://img.shields.io/pypi/pyversions/fastapi-cachex.svg?logo=python&label=Python&logoColor=gold)](https://pypi.org/project/fastapi-cachex/)
45
+
46
+ [English](README.md) | [繁體中文](docs/README.zh-TW.md)
47
+
48
+ A high-performance caching extension for FastAPI, providing comprehensive HTTP caching support.
49
+
50
+ ## Features
51
+
52
+ - Support for HTTP caching headers
53
+ - `Cache-Control`
54
+ - `ETag`
55
+ - `If-None-Match`
56
+ - Multiple backend cache support
57
+ - Redis
58
+ - Memcached
59
+ - In-memory cache
60
+ - Complete Cache-Control directive implementation
61
+ - Easy-to-use `@cache` decorator
62
+
63
+ ## Installation
64
+
65
+ ### Using pip
66
+
67
+ ```bash
68
+ pip install fastapi-cachex
69
+ ```
70
+
71
+ ### Using uv (recommended)
72
+
73
+ ```bash
74
+ uv pip install fastapi-cachex
75
+ ```
76
+
77
+ ## Quick Start
78
+
79
+ ```python
80
+ from fastapi import FastAPI
81
+ from fastapi_cachex import cache, BackendProxy
82
+ from fastapi_cachex.backends import MemoryBackend, MemcachedBackend
83
+
84
+ app = FastAPI()
85
+
86
+ # Configure your cache backend
87
+ memory_backend = MemoryBackend() # In-memory cache
88
+ # or
89
+ memcached_backend = MemcachedBackend(servers=["localhost:11211"]) # Memcached
90
+
91
+ # Set the backend you want to use
92
+ BackendProxy.set_backend(memory_backend) # or memcached_backend
93
+
94
+
95
+ @app.get("/")
96
+ @cache(ttl=60) # Cache for 60 seconds
97
+ async def read_root():
98
+ return {"Hello": "World"}
99
+ ```
100
+
101
+ ## Backend Configuration
102
+
103
+ FastAPI-CacheX supports multiple caching backends. You can easily switch between them using the `BackendProxy`.
104
+
105
+ ### In-Memory Cache
106
+
107
+ ```python
108
+ from fastapi_cachex.backends import MemoryBackend
109
+ from fastapi_cachex import BackendProxy
110
+
111
+ backend = MemoryBackend()
112
+ BackendProxy.set_backend(backend)
113
+ ```
114
+
115
+ ### Memcached
116
+
117
+ ```python
118
+ from fastapi_cachex.backends import MemcachedBackend
119
+ from fastapi_cachex import BackendProxy
120
+
121
+ backend = MemcachedBackend(servers=["localhost:11211"])
122
+ BackendProxy.set_backend(backend)
123
+ ```
124
+
125
+ ### Redis (Coming Soon)
126
+
127
+ Redis support is under development and will be available in future releases.
128
+
129
+ ## Development Guide
130
+
131
+ ### Running Tests
132
+
133
+ 1. Run unit tests:
134
+
135
+ ```bash
136
+ pytest
137
+ ```
138
+
139
+ 2. Run tests with coverage report:
140
+
141
+ ```bash
142
+ pytest --cov=fastapi_cachex
143
+ ```
144
+
145
+ ### Using tox
146
+
147
+ tox ensures the code works across different Python versions (3.10-3.13).
148
+
149
+ 1. Install all Python versions
150
+ 2. Run tox:
151
+
152
+ ```bash
153
+ tox
154
+ ```
155
+
156
+ To run for a specific Python version:
157
+
158
+ ```bash
159
+ tox -e py310 # only run for Python 3.10
160
+ ```
161
+
162
+ ## Contributing
163
+
164
+ 1. Fork the project
165
+ 2. Create your feature branch (`git checkout -b feature/AmazingFeature`)
166
+ 3. Commit your changes (`git commit -m 'Add some AmazingFeature'`)
167
+ 4. Push to the branch (`git push origin feature/AmazingFeature`)
168
+ 5. Open a Pull Request
169
+
170
+ ## License
171
+
172
+ This project is licensed under the Apache License 2.0 - see the [LICENSE](LICENSE) file for details.
@@ -1,14 +1,3 @@
1
- Metadata-Version: 2.4
2
- Name: fastapi-cachex
3
- Version: 0.1.0
4
- Summary: Add your description here
5
- Requires-Python: >=3.10
6
- Description-Content-Type: text/markdown
7
- License-File: LICENSE
8
- Requires-Dist: fastapi>=0.115.12
9
- Requires-Dist: httpx>=0.28.1
10
- Dynamic: license-file
11
-
12
1
  # FastAPI-Cache X
13
2
 
14
3
  [![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)
@@ -16,8 +5,12 @@ Dynamic: license-file
16
5
  [![Tests](https://github.com/allen0099/FastAPI-CacheX/actions/workflows/test.yml/badge.svg)](https://github.com/allen0099/FastAPI-CacheX/actions/workflows/test.yml)
17
6
  [![Coverage Status](https://raw.githubusercontent.com/allen0099/FastAPI-CacheX/coverage-badge/coverage.svg)](https://github.com/allen0099/FastAPI-CacheX/actions/workflows/test.yml)
18
7
 
19
- [![PyPI version](https://badge.fury.io/py/fastapi-cachex.svg)](https://badge.fury.io/py/fastapi-cachex)
20
- [![Python Versions](https://img.shields.io/pypi/pyversions/fastapi-cachex.svg)](https://pypi.org/project/fastapi-cachex/)
8
+ [![Downloads](https://static.pepy.tech/badge/fastapi-cachex)](https://pepy.tech/project/fastapi-cachex)
9
+ [![Weekly downloads](https://static.pepy.tech/badge/fastapi-cachex/week)](https://pepy.tech/project/fastapi-cachex)
10
+ [![Monthly downloads](https://static.pepy.tech/badge/fastapi-cachex/month)](https://pepy.tech/project/fastapi-cachex)
11
+
12
+ [![PyPI version](https://img.shields.io/pypi/v/fastapi-cachex.svg?logo=pypi&logoColor=gold&label=PyPI)](https://pypi.org/project/fastapi-cachex)
13
+ [![Python Versions](https://img.shields.io/pypi/pyversions/fastapi-cachex.svg?logo=python&label=Python&logoColor=gold)](https://pypi.org/project/fastapi-cachex/)
21
14
 
22
15
  [English](README.md) | [繁體中文](docs/README.zh-TW.md)
23
16
 
@@ -54,17 +47,54 @@ uv pip install fastapi-cachex
54
47
 
55
48
  ```python
56
49
  from fastapi import FastAPI
57
- from fastapi_cachex import cache
50
+ from fastapi_cachex import cache, BackendProxy
51
+ from fastapi_cachex.backends import MemoryBackend, MemcachedBackend
58
52
 
59
53
  app = FastAPI()
60
54
 
55
+ # Configure your cache backend
56
+ memory_backend = MemoryBackend() # In-memory cache
57
+ # or
58
+ memcached_backend = MemcachedBackend(servers=["localhost:11211"]) # Memcached
59
+
60
+ # Set the backend you want to use
61
+ BackendProxy.set_backend(memory_backend) # or memcached_backend
62
+
61
63
 
62
64
  @app.get("/")
63
- @cache()
65
+ @cache(ttl=60) # Cache for 60 seconds
64
66
  async def read_root():
65
67
  return {"Hello": "World"}
66
68
  ```
67
69
 
70
+ ## Backend Configuration
71
+
72
+ FastAPI-CacheX supports multiple caching backends. You can easily switch between them using the `BackendProxy`.
73
+
74
+ ### In-Memory Cache
75
+
76
+ ```python
77
+ from fastapi_cachex.backends import MemoryBackend
78
+ from fastapi_cachex import BackendProxy
79
+
80
+ backend = MemoryBackend()
81
+ BackendProxy.set_backend(backend)
82
+ ```
83
+
84
+ ### Memcached
85
+
86
+ ```python
87
+ from fastapi_cachex.backends import MemcachedBackend
88
+ from fastapi_cachex import BackendProxy
89
+
90
+ backend = MemcachedBackend(servers=["localhost:11211"])
91
+ BackendProxy.set_backend(backend)
92
+ ```
93
+
94
+ ### Redis (Coming Soon)
95
+
96
+ Redis support is under development and will be available in future releases.
97
+
68
98
  ## Development Guide
69
99
 
70
100
  ### Running Tests
@@ -1,2 +1,3 @@
1
1
  from .base import BaseCacheBackend as BaseCacheBackend
2
+ from .memcached import MemcachedBackend as MemcachedBackend
2
3
  from .memory import MemoryBackend as MemoryBackend
@@ -0,0 +1,74 @@
1
+ import ast
2
+ from typing import Optional
3
+
4
+ from fastapi_cachex.backends.base import BaseCacheBackend
5
+ from fastapi_cachex.exceptions import CacheXError
6
+ from fastapi_cachex.types import ETagContent
7
+
8
+
9
+ class MemcachedBackend(BaseCacheBackend):
10
+ """Memcached backend implementation."""
11
+
12
+ def __init__(self, servers: list[str]) -> None:
13
+ """Initialize the Memcached backend.
14
+
15
+ Args:
16
+ servers: List of Memcached servers in format ["host:port", ...]
17
+
18
+ Raises:
19
+ CacheXError: If pymemcache is not installed
20
+ """
21
+ try:
22
+ from pymemcache import HashClient
23
+ except ImportError:
24
+ raise CacheXError(
25
+ "pymemcache is not installed. Please install it with 'pip install pymemcache'"
26
+ )
27
+
28
+ self.client = HashClient(servers)
29
+
30
+ async def get(self, key: str) -> Optional[ETagContent]:
31
+ """Get value from cache.
32
+
33
+ Args:
34
+ key: Cache key to retrieve
35
+
36
+ Returns:
37
+ Optional[ETagContent]: Cached value with ETag if exists, None otherwise
38
+ """
39
+ value = self.client.get(key)
40
+ if value is None:
41
+ return None
42
+
43
+ # Memcached stores data as bytes
44
+ # Convert string back to dictionary
45
+ value_dict = ast.literal_eval(value.decode("utf-8"))
46
+ return ETagContent(etag=value_dict["etag"], content=value_dict["content"])
47
+
48
+ async def set(
49
+ self, key: str, value: ETagContent, ttl: Optional[int] = None
50
+ ) -> None:
51
+ """Set value in cache.
52
+
53
+ Args:
54
+ key: Cache key
55
+ value: ETagContent to store
56
+ ttl: Time to live in seconds
57
+ """
58
+ # Store as dictionary in string format
59
+ data = {"etag": value.etag, "content": value.content}
60
+ self.client.set(
61
+ key, str(data).encode("utf-8"), expire=ttl if ttl is not None else 0
62
+ )
63
+
64
+ async def delete(self, key: str) -> None:
65
+ """Delete value from cache.
66
+
67
+ Args:
68
+ key: Cache key to delete
69
+ """
70
+ self.client.delete(key)
71
+
72
+ async def clear(self) -> None:
73
+ """Clear all values from cache."""
74
+ self.client.flush_all()
@@ -1,7 +1,9 @@
1
+ from typing import Optional
2
+
1
3
  from fastapi_cachex.backends import BaseCacheBackend
2
4
  from fastapi_cachex.exceptions import BackendNotFoundError
3
5
 
4
- _default_backend: BaseCacheBackend | None = None
6
+ _default_backend: Optional[BaseCacheBackend] = None
5
7
 
6
8
 
7
9
  class BackendProxy:
@@ -17,7 +19,11 @@ class BackendProxy:
17
19
  return _default_backend
18
20
 
19
21
  @staticmethod
20
- def set_backend(backend: BaseCacheBackend) -> None:
21
- """Set the backend for caching."""
22
+ def set_backend(backend: Optional[BaseCacheBackend]) -> None:
23
+ """Set the backend for caching.
24
+
25
+ Args:
26
+ backend: The backend to use for caching, or None to clear the current backend
27
+ """
22
28
  global _default_backend
23
29
  _default_backend = backend
@@ -0,0 +1,172 @@
1
+ Metadata-Version: 2.4
2
+ Name: fastapi-cachex
3
+ Version: 0.1.2
4
+ Summary: A caching library for FastAPI with support for Cache-Control, ETag, and multiple backends.
5
+ Author-email: Allen <s96016641@gmail.com>
6
+ License-Expression: Apache-2.0
7
+ Project-URL: Homepage, https://github.com/allen0099/FastAPI-CacheX
8
+ Project-URL: Repository, https://github.com/allen0099/FastAPI-CacheX.git
9
+ Project-URL: Issues, https://github.com/allen0099/FastAPI-CacheX/issues
10
+ Keywords: fastapi,cache,etag,cache-control,redis,memcached,in-memory
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: Programming Language :: Python
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Programming Language :: Python :: 3 :: Only
20
+ Classifier: Framework :: FastAPI
21
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
22
+ Classifier: Topic :: Internet :: WWW/HTTP :: HTTP Servers
23
+ Requires-Python: >=3.10
24
+ Description-Content-Type: text/markdown
25
+ License-File: LICENSE
26
+ Requires-Dist: fastapi
27
+ Requires-Dist: httpx
28
+ Provides-Extra: memcache
29
+ Requires-Dist: pymemcache; extra == "memcache"
30
+ Dynamic: license-file
31
+
32
+ # FastAPI-Cache X
33
+
34
+ [![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)
35
+ [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
36
+ [![Tests](https://github.com/allen0099/FastAPI-CacheX/actions/workflows/test.yml/badge.svg)](https://github.com/allen0099/FastAPI-CacheX/actions/workflows/test.yml)
37
+ [![Coverage Status](https://raw.githubusercontent.com/allen0099/FastAPI-CacheX/coverage-badge/coverage.svg)](https://github.com/allen0099/FastAPI-CacheX/actions/workflows/test.yml)
38
+
39
+ [![Downloads](https://static.pepy.tech/badge/fastapi-cachex)](https://pepy.tech/project/fastapi-cachex)
40
+ [![Weekly downloads](https://static.pepy.tech/badge/fastapi-cachex/week)](https://pepy.tech/project/fastapi-cachex)
41
+ [![Monthly downloads](https://static.pepy.tech/badge/fastapi-cachex/month)](https://pepy.tech/project/fastapi-cachex)
42
+
43
+ [![PyPI version](https://img.shields.io/pypi/v/fastapi-cachex.svg?logo=pypi&logoColor=gold&label=PyPI)](https://pypi.org/project/fastapi-cachex)
44
+ [![Python Versions](https://img.shields.io/pypi/pyversions/fastapi-cachex.svg?logo=python&label=Python&logoColor=gold)](https://pypi.org/project/fastapi-cachex/)
45
+
46
+ [English](README.md) | [繁體中文](docs/README.zh-TW.md)
47
+
48
+ A high-performance caching extension for FastAPI, providing comprehensive HTTP caching support.
49
+
50
+ ## Features
51
+
52
+ - Support for HTTP caching headers
53
+ - `Cache-Control`
54
+ - `ETag`
55
+ - `If-None-Match`
56
+ - Multiple backend cache support
57
+ - Redis
58
+ - Memcached
59
+ - In-memory cache
60
+ - Complete Cache-Control directive implementation
61
+ - Easy-to-use `@cache` decorator
62
+
63
+ ## Installation
64
+
65
+ ### Using pip
66
+
67
+ ```bash
68
+ pip install fastapi-cachex
69
+ ```
70
+
71
+ ### Using uv (recommended)
72
+
73
+ ```bash
74
+ uv pip install fastapi-cachex
75
+ ```
76
+
77
+ ## Quick Start
78
+
79
+ ```python
80
+ from fastapi import FastAPI
81
+ from fastapi_cachex import cache, BackendProxy
82
+ from fastapi_cachex.backends import MemoryBackend, MemcachedBackend
83
+
84
+ app = FastAPI()
85
+
86
+ # Configure your cache backend
87
+ memory_backend = MemoryBackend() # In-memory cache
88
+ # or
89
+ memcached_backend = MemcachedBackend(servers=["localhost:11211"]) # Memcached
90
+
91
+ # Set the backend you want to use
92
+ BackendProxy.set_backend(memory_backend) # or memcached_backend
93
+
94
+
95
+ @app.get("/")
96
+ @cache(ttl=60) # Cache for 60 seconds
97
+ async def read_root():
98
+ return {"Hello": "World"}
99
+ ```
100
+
101
+ ## Backend Configuration
102
+
103
+ FastAPI-CacheX supports multiple caching backends. You can easily switch between them using the `BackendProxy`.
104
+
105
+ ### In-Memory Cache
106
+
107
+ ```python
108
+ from fastapi_cachex.backends import MemoryBackend
109
+ from fastapi_cachex import BackendProxy
110
+
111
+ backend = MemoryBackend()
112
+ BackendProxy.set_backend(backend)
113
+ ```
114
+
115
+ ### Memcached
116
+
117
+ ```python
118
+ from fastapi_cachex.backends import MemcachedBackend
119
+ from fastapi_cachex import BackendProxy
120
+
121
+ backend = MemcachedBackend(servers=["localhost:11211"])
122
+ BackendProxy.set_backend(backend)
123
+ ```
124
+
125
+ ### Redis (Coming Soon)
126
+
127
+ Redis support is under development and will be available in future releases.
128
+
129
+ ## Development Guide
130
+
131
+ ### Running Tests
132
+
133
+ 1. Run unit tests:
134
+
135
+ ```bash
136
+ pytest
137
+ ```
138
+
139
+ 2. Run tests with coverage report:
140
+
141
+ ```bash
142
+ pytest --cov=fastapi_cachex
143
+ ```
144
+
145
+ ### Using tox
146
+
147
+ tox ensures the code works across different Python versions (3.10-3.13).
148
+
149
+ 1. Install all Python versions
150
+ 2. Run tox:
151
+
152
+ ```bash
153
+ tox
154
+ ```
155
+
156
+ To run for a specific Python version:
157
+
158
+ ```bash
159
+ tox -e py310 # only run for Python 3.10
160
+ ```
161
+
162
+ ## Contributing
163
+
164
+ 1. Fork the project
165
+ 2. Create your feature branch (`git checkout -b feature/AmazingFeature`)
166
+ 3. Commit your changes (`git commit -m 'Add some AmazingFeature'`)
167
+ 4. Push to the branch (`git push origin feature/AmazingFeature`)
168
+ 5. Open a Pull Request
169
+
170
+ ## License
171
+
172
+ This project is licensed under the Apache License 2.0 - see the [LICENSE](LICENSE) file for details.
@@ -14,5 +14,7 @@ fastapi_cachex.egg-info/requires.txt
14
14
  fastapi_cachex.egg-info/top_level.txt
15
15
  fastapi_cachex/backends/__init__.py
16
16
  fastapi_cachex/backends/base.py
17
+ fastapi_cachex/backends/memcached.py
17
18
  fastapi_cachex/backends/memory.py
18
- tests/test_cache.py
19
+ tests/test_cache.py
20
+ tests/test_proxybackend.py
@@ -0,0 +1,5 @@
1
+ fastapi
2
+ httpx
3
+
4
+ [memcache]
5
+ pymemcache
@@ -1,18 +1,43 @@
1
1
  [project]
2
2
  name = "fastapi-cachex"
3
- version = "0.1.0"
4
- description = "Add your description here"
3
+ version = "0.1.2" # Initial release version
4
+ description = "A caching library for FastAPI with support for Cache-Control, ETag, and multiple backends."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
7
+ license = "Apache-2.0"
8
+ authors = [
9
+ { name = "Allen", email = "s96016641@gmail.com" }
10
+ ]
11
+ classifiers = [
12
+ "Development Status :: 3 - Alpha",
13
+ "Intended Audience :: Developers",
14
+ "Programming Language :: Python",
15
+ "Programming Language :: Python :: 3",
16
+ "Programming Language :: Python :: 3.10",
17
+ "Programming Language :: Python :: 3.11",
18
+ "Programming Language :: Python :: 3.12",
19
+ "Programming Language :: Python :: 3.13",
20
+ "Programming Language :: Python :: 3 :: Only",
21
+ "Framework :: FastAPI",
22
+ "Topic :: Software Development :: Libraries :: Python Modules",
23
+ "Topic :: Internet :: WWW/HTTP :: HTTP Servers",
24
+ ]
25
+ keywords = ["fastapi", "cache", "etag", "cache-control", "redis", "memcached", "in-memory"]
7
26
  dependencies = [
8
- "fastapi>=0.115.12",
9
- "httpx>=0.28.1",
27
+ "fastapi",
28
+ "httpx",
10
29
  ]
11
30
 
31
+ [project.urls]
32
+ Homepage = "https://github.com/allen0099/FastAPI-CacheX"
33
+ Repository = "https://github.com/allen0099/FastAPI-CacheX.git"
34
+ Issues = "https://github.com/allen0099/FastAPI-CacheX/issues"
35
+
12
36
  [dependency-groups]
13
37
  dev = [
14
38
  "coverage>=7.8.0",
15
39
  "pre-commit>=4.2.0",
40
+ "pymemcache>=4.0.0",
16
41
  "pytest>=8.3.5",
17
42
  "pytest-asyncio>=0.26.0",
18
43
  "pytest-cov>=6.1.0",
@@ -20,6 +45,9 @@ dev = [
20
45
  "tox>=4.25.0",
21
46
  ]
22
47
 
48
+ [project.optional-dependencies]
49
+ memcache = ["pymemcache"]
50
+
23
51
  [tool.pytest.ini_options]
24
52
  pythonpath = [
25
53
  "."
@@ -0,0 +1,101 @@
1
+ import asyncio
2
+
3
+ import pytest
4
+ import pytest_asyncio
5
+ from fastapi import FastAPI
6
+ from fastapi.responses import JSONResponse
7
+ from fastapi.testclient import TestClient
8
+
9
+ from fastapi_cachex import BackendProxy
10
+ from fastapi_cachex import cache
11
+ from fastapi_cachex.backends import MemoryBackend
12
+ from fastapi_cachex.exceptions import BackendNotFoundError
13
+ from fastapi_cachex.types import ETagContent
14
+
15
+ app = FastAPI()
16
+ client = TestClient(app)
17
+
18
+
19
+ @pytest_asyncio.fixture(autouse=True)
20
+ async def cleanup():
21
+ # Reset backend before each test
22
+ try:
23
+ backend = BackendProxy.get_backend()
24
+ if isinstance(backend, MemoryBackend):
25
+ backend.stop_cleanup()
26
+ # Reset backend by setting it to None
27
+ BackendProxy.set_backend(None)
28
+ except BackendNotFoundError:
29
+ pass
30
+
31
+ yield
32
+
33
+ # Clean up after each test
34
+ try:
35
+ backend = BackendProxy.get_backend()
36
+ if isinstance(backend, MemoryBackend):
37
+ await backend.clear() # Clear all cached data
38
+ backend.stop_cleanup()
39
+ # Reset backend by setting it to None
40
+ BackendProxy.set_backend(None)
41
+ except BackendNotFoundError:
42
+ pass
43
+
44
+
45
+ def test_backend_switching():
46
+ # Initial state should have no backend
47
+ with pytest.raises(BackendNotFoundError):
48
+ BackendProxy.get_backend()
49
+
50
+ # Set up MemoryBackend
51
+ memory_backend = MemoryBackend()
52
+ BackendProxy.set_backend(memory_backend)
53
+ assert isinstance(BackendProxy.get_backend(), MemoryBackend)
54
+
55
+
56
+ def test_memory_cache():
57
+ @app.get("/test")
58
+ @cache(ttl=60)
59
+ async def test_endpoint():
60
+ return JSONResponse(content={"message": "test"})
61
+
62
+ # Use MemoryBackend
63
+ memory_backend = MemoryBackend()
64
+ BackendProxy.set_backend(memory_backend)
65
+
66
+ # First request should return 200
67
+ response1 = client.get("/test")
68
+ assert response1.status_code == 200
69
+ etag1 = response1.headers["ETag"]
70
+
71
+ # Request with same ETag should return 304
72
+ response2 = client.get("/test", headers={"If-None-Match": etag1})
73
+ assert response2.status_code == 304
74
+
75
+
76
+ @pytest.mark.asyncio
77
+ async def test_backend_cleanup():
78
+ # Run cleanup task in async environment
79
+ memory_backend = MemoryBackend()
80
+ BackendProxy.set_backend(memory_backend)
81
+
82
+ # Verify initial state
83
+ assert memory_backend._cleanup_task is None
84
+
85
+ # Set test data
86
+ test_value = ETagContent(etag="test-etag", content="test_value")
87
+ await memory_backend.set("test_key", test_value, ttl=1)
88
+
89
+ # Verify data is stored correctly
90
+ cached_value = await memory_backend.get("test_key")
91
+ assert cached_value is not None
92
+ assert cached_value.content == "test_value"
93
+
94
+ # Wait for data to expire (1 second + extra time)
95
+ await asyncio.sleep(1.1)
96
+
97
+ # Execute cleanup
98
+ await memory_backend.cleanup()
99
+
100
+ # Verify data has been cleaned up
101
+ assert await memory_backend.get("test_key") is None
@@ -1,100 +0,0 @@
1
- # FastAPI-Cache X
2
-
3
- [![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)
4
- [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
5
- [![Tests](https://github.com/allen0099/FastAPI-CacheX/actions/workflows/test.yml/badge.svg)](https://github.com/allen0099/FastAPI-CacheX/actions/workflows/test.yml)
6
- [![Coverage Status](https://raw.githubusercontent.com/allen0099/FastAPI-CacheX/coverage-badge/coverage.svg)](https://github.com/allen0099/FastAPI-CacheX/actions/workflows/test.yml)
7
-
8
- [![PyPI version](https://badge.fury.io/py/fastapi-cachex.svg)](https://badge.fury.io/py/fastapi-cachex)
9
- [![Python Versions](https://img.shields.io/pypi/pyversions/fastapi-cachex.svg)](https://pypi.org/project/fastapi-cachex/)
10
-
11
- [English](README.md) | [繁體中文](docs/README.zh-TW.md)
12
-
13
- A high-performance caching extension for FastAPI, providing comprehensive HTTP caching support.
14
-
15
- ## Features
16
-
17
- - Support for HTTP caching headers
18
- - `Cache-Control`
19
- - `ETag`
20
- - `If-None-Match`
21
- - Multiple backend cache support
22
- - Redis
23
- - Memcached
24
- - In-memory cache
25
- - Complete Cache-Control directive implementation
26
- - Easy-to-use `@cache` decorator
27
-
28
- ## Installation
29
-
30
- ### Using pip
31
-
32
- ```bash
33
- pip install fastapi-cachex
34
- ```
35
-
36
- ### Using uv (recommended)
37
-
38
- ```bash
39
- uv pip install fastapi-cachex
40
- ```
41
-
42
- ## Quick Start
43
-
44
- ```python
45
- from fastapi import FastAPI
46
- from fastapi_cachex import cache
47
-
48
- app = FastAPI()
49
-
50
-
51
- @app.get("/")
52
- @cache()
53
- async def read_root():
54
- return {"Hello": "World"}
55
- ```
56
-
57
- ## Development Guide
58
-
59
- ### Running Tests
60
-
61
- 1. Run unit tests:
62
-
63
- ```bash
64
- pytest
65
- ```
66
-
67
- 2. Run tests with coverage report:
68
-
69
- ```bash
70
- pytest --cov=fastapi_cachex
71
- ```
72
-
73
- ### Using tox
74
-
75
- tox ensures the code works across different Python versions (3.10-3.13).
76
-
77
- 1. Install all Python versions
78
- 2. Run tox:
79
-
80
- ```bash
81
- tox
82
- ```
83
-
84
- To run for a specific Python version:
85
-
86
- ```bash
87
- tox -e py310 # only run for Python 3.10
88
- ```
89
-
90
- ## Contributing
91
-
92
- 1. Fork the project
93
- 2. Create your feature branch (`git checkout -b feature/AmazingFeature`)
94
- 3. Commit your changes (`git commit -m 'Add some AmazingFeature'`)
95
- 4. Push to the branch (`git push origin feature/AmazingFeature`)
96
- 5. Open a Pull Request
97
-
98
- ## License
99
-
100
- This project is licensed under the Apache License 2.0 - see the [LICENSE](LICENSE) file for details.
@@ -1,111 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: fastapi-cachex
3
- Version: 0.1.0
4
- Summary: Add your description here
5
- Requires-Python: >=3.10
6
- Description-Content-Type: text/markdown
7
- License-File: LICENSE
8
- Requires-Dist: fastapi>=0.115.12
9
- Requires-Dist: httpx>=0.28.1
10
- Dynamic: license-file
11
-
12
- # FastAPI-Cache X
13
-
14
- [![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)
15
- [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
16
- [![Tests](https://github.com/allen0099/FastAPI-CacheX/actions/workflows/test.yml/badge.svg)](https://github.com/allen0099/FastAPI-CacheX/actions/workflows/test.yml)
17
- [![Coverage Status](https://raw.githubusercontent.com/allen0099/FastAPI-CacheX/coverage-badge/coverage.svg)](https://github.com/allen0099/FastAPI-CacheX/actions/workflows/test.yml)
18
-
19
- [![PyPI version](https://badge.fury.io/py/fastapi-cachex.svg)](https://badge.fury.io/py/fastapi-cachex)
20
- [![Python Versions](https://img.shields.io/pypi/pyversions/fastapi-cachex.svg)](https://pypi.org/project/fastapi-cachex/)
21
-
22
- [English](README.md) | [繁體中文](docs/README.zh-TW.md)
23
-
24
- A high-performance caching extension for FastAPI, providing comprehensive HTTP caching support.
25
-
26
- ## Features
27
-
28
- - Support for HTTP caching headers
29
- - `Cache-Control`
30
- - `ETag`
31
- - `If-None-Match`
32
- - Multiple backend cache support
33
- - Redis
34
- - Memcached
35
- - In-memory cache
36
- - Complete Cache-Control directive implementation
37
- - Easy-to-use `@cache` decorator
38
-
39
- ## Installation
40
-
41
- ### Using pip
42
-
43
- ```bash
44
- pip install fastapi-cachex
45
- ```
46
-
47
- ### Using uv (recommended)
48
-
49
- ```bash
50
- uv pip install fastapi-cachex
51
- ```
52
-
53
- ## Quick Start
54
-
55
- ```python
56
- from fastapi import FastAPI
57
- from fastapi_cachex import cache
58
-
59
- app = FastAPI()
60
-
61
-
62
- @app.get("/")
63
- @cache()
64
- async def read_root():
65
- return {"Hello": "World"}
66
- ```
67
-
68
- ## Development Guide
69
-
70
- ### Running Tests
71
-
72
- 1. Run unit tests:
73
-
74
- ```bash
75
- pytest
76
- ```
77
-
78
- 2. Run tests with coverage report:
79
-
80
- ```bash
81
- pytest --cov=fastapi_cachex
82
- ```
83
-
84
- ### Using tox
85
-
86
- tox ensures the code works across different Python versions (3.10-3.13).
87
-
88
- 1. Install all Python versions
89
- 2. Run tox:
90
-
91
- ```bash
92
- tox
93
- ```
94
-
95
- To run for a specific Python version:
96
-
97
- ```bash
98
- tox -e py310 # only run for Python 3.10
99
- ```
100
-
101
- ## Contributing
102
-
103
- 1. Fork the project
104
- 2. Create your feature branch (`git checkout -b feature/AmazingFeature`)
105
- 3. Commit your changes (`git commit -m 'Add some AmazingFeature'`)
106
- 4. Push to the branch (`git push origin feature/AmazingFeature`)
107
- 5. Open a Pull Request
108
-
109
- ## License
110
-
111
- This project is licensed under the Apache License 2.0 - see the [LICENSE](LICENSE) file for details.
@@ -1,2 +0,0 @@
1
- fastapi>=0.115.12
2
- httpx>=0.28.1
File without changes
File without changes