Skip to content

Commit 6d0b9f6

Browse files
committed
docs(README): add module structure and class diagrams
- Add Mermaid diagrams to illustrate module structure and class relationships - Include diagrams for core classes, strategy pattern, mixins, cluster support, decorator, proxy, and weak reference - Update BaseSinglePolicy initialization to include type checking for cache parameter
1 parent 440054f commit 6d0b9f6

File tree

2 files changed

+161
-0
lines changed

2 files changed

+161
-0
lines changed

README.md

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -861,6 +861,165 @@ We suggest installing [pre-commit][] hooks:
861861
pre-commit install
862862
```
863863
864+
### Module structure
865+
866+
```mermaid
867+
graph TD
868+
A[RedisFuncCache] --> B[AbstractPolicy]
869+
A --> C[Serializer]
870+
A --> D[Script Execution]
871+
B --> E[BaseSinglePolicy]
872+
B --> F[BaseMultiplePolicy]
873+
E --> G[FifoPolicy]
874+
E --> H[LfuPolicy]
875+
E --> I[LruPolicy]
876+
E --> J[RrPolicy]
877+
G --> K[FifoScriptsMixin]
878+
H --> L[LfuScriptsMixin]
879+
I --> M[LruScriptsMixin]
880+
J --> N[RrScriptsMixin]
881+
K --> O[lua/fifo_get.lua]
882+
K --> P[lua/fifo_put.lua]
883+
M --> Q[lua/lru_get.lua]
884+
M --> R[lua/lru_put.lua]
885+
A --> S[utils.py]
886+
S --> T[b64digest]
887+
S --> U[get_callable_bytecode]
888+
```
889+
890+
### Class Diagrams
891+
892+
Core class:
893+
894+
```mermaid
895+
classDiagram
896+
class RedisFuncCache {
897+
-client: RedisClientTV
898+
-policy: AbstractPolicy
899+
-serializer: SerializerPairT
900+
+__init__(name, policy, client, serializer)
901+
+__call__(func)
902+
+decorate(func)
903+
+exec(user_function, user_args, user_kwds)
904+
+aexec(user_function, user_args, user_kwds)
905+
}
906+
907+
class AbstractPolicy {
908+
<<abstract>>
909+
__key__: str
910+
__scripts__: Tuple[str, str]
911+
+__init__(cache)
912+
+calc_keys(f, args, kwds) -> Tuple[str, str]
913+
+calc_hash(f, args, kwds) -> KeyT
914+
+purge() -> int
915+
+apurge() -> int
916+
}
917+
918+
class BaseSinglePolicy {
919+
_keys: Optional[Tuple[str, str]]
920+
+__init__(cache)
921+
+calc_keys(f, args, kwds) -> Tuple[str, str]
922+
+purge()
923+
+apurge()
924+
}
925+
926+
class BaseMultiplePolicy {
927+
+calc_keys(f, args, kwds) -> Tuple[str, str]
928+
}
929+
930+
RedisFuncCache --> AbstractPolicy : uses
931+
AbstractPolicy <|-- BaseSinglePolicy
932+
AbstractPolicy <|-- BaseMultiplePolicy
933+
```
934+
935+
Strategy pattern and mixins:
936+
937+
```mermaid
938+
classDiagram
939+
class LruPolicy {
940+
__key__ = "lru"
941+
}
942+
943+
class LruScriptsMixin {
944+
__scripts__ = "lru_get.lua", "lru_put.lua"
945+
}
946+
947+
class PickleMd5HashMixin {
948+
__hash_config__ = ...
949+
}
950+
951+
BaseSinglePolicy <|-- LruPolicy
952+
LruScriptsMixin -- LruPolicy
953+
PickleMd5HashMixin -- LruPolicy
954+
955+
class FifoPolicy {
956+
__key__ = "fifo"
957+
}
958+
959+
class FifoScriptsMixin {
960+
__scripts__ = "fifo_get.lua", "fifo_put.lua"
961+
}
962+
963+
BaseSinglePolicy <|-- FifoPolicy
964+
FifoScriptsMixin -- FifoPolicy
965+
```
966+
967+
Cluster and multiple-keys support
968+
969+
```mermaid
970+
classDiagram
971+
class BaseClusterSinglePolicy {
972+
+calc_keys(f, args, kwds) -> Tuple[str, str]
973+
}
974+
975+
class BaseClusterMultiplePolicy {
976+
+calc_keys(f, args, kwds) -> Tuple[str, str]
977+
}
978+
979+
BaseSinglePolicy <|-- BaseClusterSinglePolicy
980+
BaseMultiplePolicy <|-- BaseClusterMultiplePolicy
981+
982+
class LruClusterPolicy {
983+
__key__ = "lru-cluster"
984+
}
985+
986+
BaseClusterSinglePolicy <|-- LruClusterPolicy
987+
```
988+
989+
Decorator and proxy:
990+
991+
```mermaid
992+
classDiagram
993+
class RedisFuncCache {
994+
+__call__(user_function) -> CallableTV
995+
+decorate(user_function) -> CallableTV
996+
}
997+
998+
class Wrapper {
999+
+wrapper(*user_args, **user_kwargs)
1000+
+awrapper(*user_args, **user_kwargs)
1001+
}
1002+
1003+
RedisFuncCache --> Wrapper
1004+
```
1005+
1006+
Weak reference:
1007+
1008+
```mermaid
1009+
classDiagram
1010+
class AbstractPolicy {
1011+
-_cache: CallableProxyType[RedisFuncCache]
1012+
+cache: RedisFuncCache
1013+
}
1014+
1015+
class RedisFuncCache {
1016+
-_policy_instance: AbstractPolicy
1017+
}
1018+
1019+
RedisFuncCache --> AbstractPolicy : creates
1020+
AbstractPolicy --> CallableProxyType : weak reference
1021+
```
1022+
8641023
> ℹ️ **Note:** \
8651024
> Ensure that you have a stable internet connection during the installation process to avoid interruptions.
8661025

src/redis_func_cache/policies/base.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ class BaseSinglePolicy(AbstractPolicy):
3636

3737
@override
3838
def __init__(self, cache: CallableProxyType[RedisFuncCache]):
39+
if not isinstance(cache, CallableProxyType) or not bool(cache):
40+
raise TypeError("The 'cache' parameter must be a valid weak reference proxy to a RedisFuncCache instance.")
3941
super().__init__(cache)
4042
self._keys: Optional[Tuple[str, str]] = None
4143

0 commit comments

Comments
 (0)