{ "module": "mongo_ops.cache.repository", "content": { "path": "mongo_ops.cache.repository", "docstring": "# Summary\n\nCached repository layer that combines a repository with a cache backend.", "objects": { "BaseDocument": { "name": "BaseDocument", "kind": "class", "path": "mongo_ops.cache.repository.BaseDocument", "signature": null, "docstring": "Base document class with common MongoDB fields.\n\nInherit from this class to create Pydantic models that represent\nMongoDB documents. It includes automatic handling of the `_id` field\nand timestamps.\n\nAttributes:\n id: The MongoDB document ID (aliased to `_id`).\n created_at: Timestamp when the document was created.\n updated_at: Timestamp when the document was last updated.", "members": { "id": { "name": "id", "kind": "attribute", "path": "mongo_ops.cache.repository.BaseDocument.id", "signature": null, "docstring": null }, "created_at": { "name": "created_at", "kind": "attribute", "path": "mongo_ops.cache.repository.BaseDocument.created_at", "signature": null, "docstring": null }, "updated_at": { "name": "updated_at", "kind": "attribute", "path": "mongo_ops.cache.repository.BaseDocument.updated_at", "signature": null, "docstring": null }, "Config": { "name": "Config", "kind": "class", "path": "mongo_ops.cache.repository.BaseDocument.Config", "signature": null, "docstring": null, "members": { "populate_by_name": { "name": "populate_by_name", "kind": "attribute", "path": "mongo_ops.cache.repository.BaseDocument.Config.populate_by_name", "signature": null, "docstring": null }, "arbitrary_types_allowed": { "name": "arbitrary_types_allowed", "kind": "attribute", "path": "mongo_ops.cache.repository.BaseDocument.Config.arbitrary_types_allowed", "signature": null, "docstring": null }, "json_encoders": { "name": "json_encoders", "kind": "attribute", "path": "mongo_ops.cache.repository.BaseDocument.Config.json_encoders", "signature": null, "docstring": null }, "json_schema_extra": { "name": "json_schema_extra", "kind": "attribute", "path": "mongo_ops.cache.repository.BaseDocument.Config.json_schema_extra", "signature": null, "docstring": null } } } } }, "BaseRepository": { "name": "BaseRepository", "kind": "class", "path": "mongo_ops.cache.repository.BaseRepository", "signature": "BaseRepository(collection_name: str, model: type[T])", "docstring": "Base repository class combining CRUD operations and collection management.\n\nThis class simplifies repository creation by automatically obtaining the\ndatabase connection and collection instance.\n\nAttributes:\n collection_name: The name of the collection managed by this repository.", "members": { "collection_name": { "name": "collection_name", "kind": "attribute", "path": "mongo_ops.cache.repository.BaseRepository.collection_name", "signature": null, "docstring": null } } }, "CacheBackend": { "name": "CacheBackend", "kind": "class", "path": "mongo_ops.cache.repository.CacheBackend", "signature": null, "docstring": "Abstract interface for cache backends.\n\nImplementations store byte-encoded values keyed by string, track usage\nstatistics, and manage their own lifecycle. The in-memory and Redis\nbackends both implement this contract.", "members": { "get": { "name": "get", "kind": "function", "path": "mongo_ops.cache.repository.CacheBackend.get", "signature": "get(key: str)", "docstring": "Fetch a value from the cache.\n\nArgs:\n key (str):\n The cache key.\n\nReturns:\n Optional[bytes]: The cached bytes, or None on a miss." }, "set": { "name": "set", "kind": "function", "path": "mongo_ops.cache.repository.CacheBackend.set", "signature": "set(key: str, value: bytes, ttl: int | None = None)", "docstring": "Store a value in the cache.\n\nArgs:\n key (str):\n The cache key.\n value (bytes):\n The byte-encoded value to store.\n ttl (Optional[int]):\n Time-to-live in seconds. When None, the backend default\n applies." }, "delete": { "name": "delete", "kind": "function", "path": "mongo_ops.cache.repository.CacheBackend.delete", "signature": "delete(key: str)", "docstring": "Remove a key from the cache.\n\nArgs:\n key (str):\n The cache key." }, "exists": { "name": "exists", "kind": "function", "path": "mongo_ops.cache.repository.CacheBackend.exists", "signature": "exists(key: str)", "docstring": "Check whether a key is present.\n\nArgs:\n key (str):\n The cache key.\n\nReturns:\n bool: True if the key exists, False otherwise." }, "clear_pattern": { "name": "clear_pattern", "kind": "function", "path": "mongo_ops.cache.repository.CacheBackend.clear_pattern", "signature": "clear_pattern(pattern: str)", "docstring": "Remove all keys matching a glob pattern.\n\nArgs:\n pattern (str):\n Glob-style pattern; a trailing `*` matches prefixes." }, "get_stats": { "name": "get_stats", "kind": "function", "path": "mongo_ops.cache.repository.CacheBackend.get_stats", "signature": "get_stats()", "docstring": "Return a snapshot of cache statistics.\n\nReturns:\n CacheStats: A copy of the current stats counters." }, "initialize": { "name": "initialize", "kind": "function", "path": "mongo_ops.cache.repository.CacheBackend.initialize", "signature": "initialize()", "docstring": "Start background resources owned by the backend.\n\nShould be called once during application startup, after the\nrepositories are connected." }, "shutdown": { "name": "shutdown", "kind": "function", "path": "mongo_ops.cache.repository.CacheBackend.shutdown", "signature": "shutdown()", "docstring": "Stop and release background resources.\n\nShould be called once during application shutdown." } } }, "CacheConfig": { "name": "CacheConfig", "kind": "class", "path": "mongo_ops.cache.repository.CacheConfig", "signature": "CacheConfig(enabled: bool = True, backend: Literal['memory', 'redis'] = 'memory', redis_client: Redis | None = None, default_ttl: int = 300, max_entries: int = 10000, key_prefix: str = '', cleanup_interval: int = 60)", "docstring": "Configuration for the cached repository layer.\n\nAttributes:\n enabled (bool):\n Whether caching is active for the repository.\n backend (Literal[\"memory\", \"redis\"]):\n Which backend to use. Defaults to \"memory\".\n redis_client (Optional[Redis]):\n Redis client required when backend is \"redis\".\n default_ttl (int):\n Default time-to-live for cached entries, in seconds.\n max_entries (int):\n Maximum entries for the in-memory backend.\n key_prefix (str):\n Prefix applied to cache keys; defaults to the collection name\n when empty.\n cleanup_interval (int):\n Interval (seconds) for the in-memory expiry sweep.", "members": { "enabled": { "name": "enabled", "kind": "attribute", "path": "mongo_ops.cache.repository.CacheConfig.enabled", "signature": null, "docstring": null }, "backend": { "name": "backend", "kind": "attribute", "path": "mongo_ops.cache.repository.CacheConfig.backend", "signature": null, "docstring": null }, "redis_client": { "name": "redis_client", "kind": "attribute", "path": "mongo_ops.cache.repository.CacheConfig.redis_client", "signature": null, "docstring": null }, "default_ttl": { "name": "default_ttl", "kind": "attribute", "path": "mongo_ops.cache.repository.CacheConfig.default_ttl", "signature": null, "docstring": null }, "max_entries": { "name": "max_entries", "kind": "attribute", "path": "mongo_ops.cache.repository.CacheConfig.max_entries", "signature": null, "docstring": null }, "key_prefix": { "name": "key_prefix", "kind": "attribute", "path": "mongo_ops.cache.repository.CacheConfig.key_prefix", "signature": null, "docstring": null }, "cleanup_interval": { "name": "cleanup_interval", "kind": "attribute", "path": "mongo_ops.cache.repository.CacheConfig.cleanup_interval", "signature": null, "docstring": null } } }, "decode_value": { "name": "decode_value", "kind": "function", "path": "mongo_ops.cache.repository.decode_value", "signature": "decode_value(data: bytes)", "docstring": "Decode cache bytes back into a dict.\n\nArgs:\n data (bytes):\n UTF-8 JSON bytes produced by encode_value().\n\nReturns:\n dict: The decoded dictionary." }, "encode_value": { "name": "encode_value", "kind": "function", "path": "mongo_ops.cache.repository.encode_value", "signature": "encode_value(value: dict)", "docstring": "Encode a dict into cache-ready bytes.\n\nNon-serializable values (e.g., ObjectId) are coerced with str().\n\nArgs:\n value (dict):\n The dictionary to encode.\n\nReturns:\n bytes: UTF-8 JSON bytes." }, "T": { "name": "T", "kind": "attribute", "path": "mongo_ops.cache.repository.T", "signature": null, "docstring": null }, "CachedBaseRepository": { "name": "CachedBaseRepository", "kind": "class", "path": "mongo_ops.cache.repository.CachedBaseRepository", "signature": "CachedBaseRepository(collection_name: str, model: type[T], cache_backend: CacheBackend, config: CacheConfig | None = None)", "docstring": "Repository that reads and writes through a cache backend.\n\nWraps an existing BaseRepository with an ID-keyed cache. Reads consult\nthe backend first and fall through to MongoDB on a miss, populating the\ncache on success. Writes invalidate or refresh the affected key.\n\nNotes:\n **Guarantees:**\n\n - The cache holds the raw document shape (``model_dump``), so FK\n references round-trip as hex strings, not populated models.\n - When ``config.enabled`` is False the repository behaves exactly\n like its parent with no cache access.", "members": { "get_by_id": { "name": "get_by_id", "kind": "function", "path": "mongo_ops.cache.repository.CachedBaseRepository.get_by_id", "signature": "get_by_id(id: str | ObjectId) -> T | None", "docstring": "Fetch a document, reading through the cache when enabled.\n\nArgs:\n id (Union[str, ObjectId]):\n The document ID.\n\nReturns:\n Optional[T]: The model instance, or None when not found." }, "create": { "name": "create", "kind": "function", "path": "mongo_ops.cache.repository.CachedBaseRepository.create", "signature": "create(data: T) -> T", "docstring": "Insert a document and cache the raw snapshot.\n\nArgs:\n data (T):\n The model instance to insert.\n\nReturns:\n T: The created model instance, including its ID." }, "update": { "name": "update", "kind": "function", "path": "mongo_ops.cache.repository.CachedBaseRepository.update", "signature": "update(id: str | ObjectId, data: dict) -> T | None", "docstring": "Update a document and refresh its cache entry.\n\nArgs:\n id (Union[str, ObjectId]):\n The document ID.\n data (dict):\n Fields to set via $set.\n\nReturns:\n Optional[T]: The updated model instance, or None when not found." }, "delete": { "name": "delete", "kind": "function", "path": "mongo_ops.cache.repository.CachedBaseRepository.delete", "signature": "delete(id: str | ObjectId) -> bool", "docstring": "Delete a document and remove its cache entry.\n\nArgs:\n id (Union[str, ObjectId]):\n The document ID.\n\nReturns:\n bool: True if a document was deleted, False otherwise." }, "warm_cache": { "name": "warm_cache", "kind": "function", "path": "mongo_ops.cache.repository.CachedBaseRepository.warm_cache", "signature": "warm_cache(ids: list[str | ObjectId]) -> int", "docstring": "Pre-populate the cache for a set of document IDs.\n\nDocs already present in the cache are skipped.\n\nArgs:\n ids (list[Union[str, ObjectId]]):\n Document IDs to warm.\n\nReturns:\n int: Number of entries added to the cache." }, "invalidate_cache": { "name": "invalidate_cache", "kind": "function", "path": "mongo_ops.cache.repository.CachedBaseRepository.invalidate_cache", "signature": "invalidate_cache(id: str | ObjectId) -> None", "docstring": "Remove a single document's cache entry.\n\nArgs:\n id (Union[str, ObjectId]):\n The document ID to invalidate." } } } } } }