docs: add AI code generation requirements and comprehensive Google-style docstrings
- Add AI code generation requirements to AGENTS.md - Add module-level docstrings to all 46 Python modules - Add detailed Google-style docstrings to all classes and functions - Remove all inline comments following self-documenting code principle - Include Args, Returns, Raises sections in function docstrings - Add Attributes and Examples sections to class docstrings
This commit is contained in:
@@ -1,4 +1,8 @@
|
||||
"""Dependency Injection using Dishka."""
|
||||
"""Dependency Injection using Dishka.
|
||||
|
||||
This module provides DI container setup and configuration
|
||||
for the application using Dishka library.
|
||||
"""
|
||||
|
||||
from app.infrastructure.di.container import create_container
|
||||
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
"""Dishka providers for dependency injection."""
|
||||
"""Dishka providers for dependency injection.
|
||||
|
||||
This module defines Dishka providers for all application dependencies.
|
||||
Providers configure how dependencies are created and scoped.
|
||||
"""
|
||||
|
||||
from collections.abc import AsyncGenerator
|
||||
|
||||
@@ -22,16 +26,31 @@ from app.infrastructure.repositories.post import SQLAlchemyPostRepository
|
||||
|
||||
|
||||
class DatabaseProvider(Provider):
|
||||
"""Provider for database-related dependencies."""
|
||||
"""Provider for database-related dependencies.
|
||||
|
||||
Provides database engine and session scoped appropriately.
|
||||
Engine is application-scoped, sessions are request-scoped.
|
||||
|
||||
Example:
|
||||
>>> provider = DatabaseProvider()
|
||||
"""
|
||||
|
||||
@provide(scope=Scope.APP)
|
||||
def get_engine(self) -> AsyncEngine:
|
||||
"""Provide SQLAlchemy engine."""
|
||||
"""Provide SQLAlchemy engine.
|
||||
|
||||
Returns:
|
||||
AsyncEngine instance for database operations.
|
||||
"""
|
||||
return engine
|
||||
|
||||
@provide(scope=Scope.REQUEST)
|
||||
async def get_session(self) -> AsyncGenerator[AsyncSession]:
|
||||
"""Provide database session per request."""
|
||||
"""Provide database session per request.
|
||||
|
||||
Yields:
|
||||
AsyncSession instance for the request lifetime.
|
||||
"""
|
||||
async with AsyncSessionLocal() as session:
|
||||
try:
|
||||
yield session
|
||||
@@ -40,27 +59,62 @@ class DatabaseProvider(Provider):
|
||||
|
||||
|
||||
class RepositoryProvider(Provider):
|
||||
"""Provider for repository implementations."""
|
||||
"""Provider for repository implementations.
|
||||
|
||||
Provides concrete repository implementations for interfaces.
|
||||
All repositories are request-scoped.
|
||||
|
||||
Example:
|
||||
>>> provider = RepositoryProvider()
|
||||
"""
|
||||
|
||||
@provide(scope=Scope.REQUEST)
|
||||
def get_post_repository(self, session: AsyncSession) -> PostRepository:
|
||||
"""Provide PostRepository implementation."""
|
||||
"""Provide PostRepository implementation.
|
||||
|
||||
Args:
|
||||
session: Database session from DI container.
|
||||
|
||||
Returns:
|
||||
SQLAlchemyPostRepository instance.
|
||||
"""
|
||||
return SQLAlchemyPostRepository(session)
|
||||
|
||||
|
||||
class TransactionManagerProvider(Provider):
|
||||
"""Provider for transaction manager."""
|
||||
"""Provider for transaction manager.
|
||||
|
||||
Provides transaction manager implementation for use cases.
|
||||
Scoped per request for transaction isolation.
|
||||
|
||||
Example:
|
||||
>>> provider = TransactionManagerProvider()
|
||||
"""
|
||||
|
||||
@provide(scope=Scope.REQUEST)
|
||||
def get_transaction_manager(self, session: AsyncSession) -> TransactionManager:
|
||||
"""Provide TransactionManager implementation."""
|
||||
"""Provide TransactionManager implementation.
|
||||
|
||||
Args:
|
||||
session: Database session from DI container.
|
||||
|
||||
Returns:
|
||||
SessionTransactionManager instance.
|
||||
"""
|
||||
from app.infrastructure.di.transaction_manager import SessionTransactionManager
|
||||
|
||||
return SessionTransactionManager(session)
|
||||
|
||||
|
||||
class UseCaseProvider(Provider):
|
||||
"""Provider for use cases."""
|
||||
"""Provider for use cases.
|
||||
|
||||
Provides all application use cases with their dependencies.
|
||||
All use cases are request-scoped for transaction isolation.
|
||||
|
||||
Example:
|
||||
>>> provider = UseCaseProvider()
|
||||
"""
|
||||
|
||||
@provide(scope=Scope.REQUEST)
|
||||
def get_create_post_use_case(
|
||||
@@ -68,7 +122,15 @@ class UseCaseProvider(Provider):
|
||||
post_repo: PostRepository,
|
||||
tx_manager: TransactionManager,
|
||||
) -> CreatePostUseCase:
|
||||
"""Provide CreatePostUseCase."""
|
||||
"""Provide CreatePostUseCase.
|
||||
|
||||
Args:
|
||||
post_repo: Post repository dependency.
|
||||
tx_manager: Transaction manager dependency.
|
||||
|
||||
Returns:
|
||||
Configured CreatePostUseCase instance.
|
||||
"""
|
||||
return CreatePostUseCase(
|
||||
post_repo=post_repo,
|
||||
tx_manager=tx_manager,
|
||||
@@ -80,7 +142,15 @@ class UseCaseProvider(Provider):
|
||||
post_repo: PostRepository,
|
||||
tx_manager: TransactionManager,
|
||||
) -> GetPostUseCase:
|
||||
"""Provide GetPostUseCase."""
|
||||
"""Provide GetPostUseCase.
|
||||
|
||||
Args:
|
||||
post_repo: Post repository dependency.
|
||||
tx_manager: Transaction manager dependency.
|
||||
|
||||
Returns:
|
||||
Configured GetPostUseCase instance.
|
||||
"""
|
||||
return GetPostUseCase(
|
||||
post_repo=post_repo,
|
||||
tx_manager=tx_manager,
|
||||
@@ -92,7 +162,15 @@ class UseCaseProvider(Provider):
|
||||
post_repo: PostRepository,
|
||||
tx_manager: TransactionManager,
|
||||
) -> UpdatePostUseCase:
|
||||
"""Provide UpdatePostUseCase."""
|
||||
"""Provide UpdatePostUseCase.
|
||||
|
||||
Args:
|
||||
post_repo: Post repository dependency.
|
||||
tx_manager: Transaction manager dependency.
|
||||
|
||||
Returns:
|
||||
Configured UpdatePostUseCase instance.
|
||||
"""
|
||||
return UpdatePostUseCase(
|
||||
post_repo=post_repo,
|
||||
tx_manager=tx_manager,
|
||||
@@ -104,7 +182,15 @@ class UseCaseProvider(Provider):
|
||||
post_repo: PostRepository,
|
||||
tx_manager: TransactionManager,
|
||||
) -> DeletePostUseCase:
|
||||
"""Provide DeletePostUseCase."""
|
||||
"""Provide DeletePostUseCase.
|
||||
|
||||
Args:
|
||||
post_repo: Post repository dependency.
|
||||
tx_manager: Transaction manager dependency.
|
||||
|
||||
Returns:
|
||||
Configured DeletePostUseCase instance.
|
||||
"""
|
||||
return DeletePostUseCase(
|
||||
post_repo=post_repo,
|
||||
tx_manager=tx_manager,
|
||||
@@ -116,7 +202,15 @@ class UseCaseProvider(Provider):
|
||||
post_repo: PostRepository,
|
||||
tx_manager: TransactionManager,
|
||||
) -> ListPostsUseCase:
|
||||
"""Provide ListPostsUseCase."""
|
||||
"""Provide ListPostsUseCase.
|
||||
|
||||
Args:
|
||||
post_repo: Post repository dependency.
|
||||
tx_manager: Transaction manager dependency.
|
||||
|
||||
Returns:
|
||||
Configured ListPostsUseCase instance.
|
||||
"""
|
||||
return ListPostsUseCase(
|
||||
post_repo=post_repo,
|
||||
tx_manager=tx_manager,
|
||||
@@ -128,7 +222,15 @@ class UseCaseProvider(Provider):
|
||||
post_repo: PostRepository,
|
||||
tx_manager: TransactionManager,
|
||||
) -> PublishPostUseCase:
|
||||
"""Provide PublishPostUseCase."""
|
||||
"""Provide PublishPostUseCase.
|
||||
|
||||
Args:
|
||||
post_repo: Post repository dependency.
|
||||
tx_manager: Transaction manager dependency.
|
||||
|
||||
Returns:
|
||||
Configured PublishPostUseCase instance.
|
||||
"""
|
||||
return PublishPostUseCase(
|
||||
post_repo=post_repo,
|
||||
tx_manager=tx_manager,
|
||||
@@ -136,9 +238,20 @@ class UseCaseProvider(Provider):
|
||||
|
||||
|
||||
class KeycloakProvider(Provider):
|
||||
"""Provider for Keycloak authentication client."""
|
||||
"""Provider for Keycloak authentication client.
|
||||
|
||||
Provides Keycloak client as application-scoped singleton.
|
||||
Client is stateless and can be shared across requests.
|
||||
|
||||
Example:
|
||||
>>> provider = KeycloakProvider()
|
||||
"""
|
||||
|
||||
@provide(scope=Scope.APP)
|
||||
def get_keycloak_client(self) -> KeycloakAuthClient:
|
||||
"""Provide KeycloakAuthClient singleton."""
|
||||
"""Provide KeycloakAuthClient singleton.
|
||||
|
||||
Returns:
|
||||
KeycloakAuthClient instance.
|
||||
"""
|
||||
return KeycloakAuthClient(settings)
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
"""SQLAlchemy implementation of Transaction Manager."""
|
||||
"""SQLAlchemy implementation of Transaction Manager.
|
||||
|
||||
This module provides the concrete implementation of TransactionManager
|
||||
using SQLAlchemy async sessions for transaction control.
|
||||
"""
|
||||
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
@@ -6,19 +10,44 @@ from app.application.interfaces import TransactionManager
|
||||
|
||||
|
||||
class SessionTransactionManager(TransactionManager):
|
||||
"""SQLAlchemy Session-based Transaction Manager."""
|
||||
"""SQLAlchemy Session-based Transaction Manager.
|
||||
|
||||
Implements transaction control using SQLAlchemy async session.
|
||||
Tracks commit state to prevent duplicate commits.
|
||||
|
||||
Attributes:
|
||||
_session: SQLAlchemy async session for transactions.
|
||||
_committed: Flag indicating if transaction was committed.
|
||||
|
||||
Example:
|
||||
>>> tx_manager = SessionTransactionManager(session)
|
||||
>>> await tx_manager.commit()
|
||||
"""
|
||||
|
||||
def __init__(self, session: AsyncSession) -> None:
|
||||
"""Initialize transaction manager.
|
||||
|
||||
Args:
|
||||
session: SQLAlchemy async session instance.
|
||||
"""
|
||||
self._session = session
|
||||
self._committed: bool = False
|
||||
|
||||
async def commit(self) -> None:
|
||||
"""Commit the current transaction."""
|
||||
"""Commit the current transaction.
|
||||
|
||||
Persists all pending changes to the database.
|
||||
Only commits once - subsequent calls are no-ops.
|
||||
"""
|
||||
if not self._committed:
|
||||
await self._session.commit()
|
||||
self._committed = True
|
||||
|
||||
async def rollback(self) -> None:
|
||||
"""Rollback the current transaction."""
|
||||
"""Rollback the current transaction.
|
||||
|
||||
Discards all pending changes.
|
||||
Only rolls back if not already committed.
|
||||
"""
|
||||
if not self._committed:
|
||||
await self._session.rollback()
|
||||
|
||||
Reference in New Issue
Block a user