Coverage for src / piccione / upload / cache_manager.py: 100%
30 statements
« prev ^ index » next coverage.py v7.13.0, created at 2025-12-11 13:41 +0000
« prev ^ index » next coverage.py v7.13.0, created at 2025-12-11 13:41 +0000
1from typing import Set
3import redis
4from redis.exceptions import ConnectionError as RedisConnectionError
7class CacheManager:
8 REDIS_KEY = "processed_files"
10 def __init__(
11 self,
12 redis_host: str = "localhost",
13 redis_port: int = 6379,
14 redis_db: int = 4,
15 ):
16 self._redis = None
17 self.redis_host = redis_host
18 self.redis_port = redis_port
19 self.redis_db = redis_db
20 self.processed_files: Set[str] = set()
22 self._init_cache()
24 def _init_redis(self) -> None:
25 """Initialize Redis connection."""
26 try:
27 self._redis = redis.Redis(
28 host=self.redis_host,
29 port=self.redis_port,
30 db=self.redis_db,
31 decode_responses=True,
32 )
33 self._redis.ping()
34 except RedisConnectionError:
35 raise RuntimeError("Redis is not available. Cache requires Redis.")
37 def _init_cache(self) -> None:
38 """Initialize cache from Redis."""
39 self._init_redis()
40 existing_redis_files = self._redis.smembers(self.REDIS_KEY)
41 self.processed_files.update(existing_redis_files)
43 def add(self, filename: str) -> None:
44 """Add a file to the cache."""
45 self.processed_files.add(filename)
46 self._redis.sadd(self.REDIS_KEY, filename)
48 def __contains__(self, filename: str) -> bool:
49 """Check if a file is in the cache."""
50 return filename in self.processed_files
52 def get_all(self) -> Set[str]:
53 """Return all files in the cache."""
54 self.processed_files.update(self._redis.smembers(self.REDIS_KEY))
55 return self.processed_files