Enhance type safety in version control system by adding UserModel TypeVar, improving type hints in managers.py and utils.py, and ensuring consistent type imports.

This commit is contained in:
pacnpal
2025-02-06 20:35:30 -05:00
parent d3141ab320
commit ea582d799c
3 changed files with 129 additions and 15 deletions

View File

@@ -1,19 +1,26 @@
from typing import Optional, List, Dict, Any, Tuple, Union
from typing import Optional, List, Dict, Any, Tuple, Type, TypeVar, cast
from django.db import transaction
from django.core.exceptions import ValidationError
from django.utils import timezone
from django.contrib.auth import get_user_model
from django.contrib.auth.models import AbstractUser
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.models import AbstractUser
from .models import VersionBranch, VersionTag, ChangeSet
User = get_user_model()
UserModel = TypeVar('UserModel', bound=AbstractUser)
User = cast(Type[UserModel], get_user_model())
class BranchManager:
"""Manages version control branch operations"""
def create_branch(self, name: str, parent: Optional[VersionBranch] = None,
user: Optional['User'] = None) -> VersionBranch:
@transaction.atomic
def create_branch(
self,
name: str,
parent: Optional[VersionBranch] = None,
user: Optional[UserModel] = None
) -> VersionBranch:
"""Create a new version branch"""
branch = VersionBranch.objects.create(
name=name,
parent=parent,
@@ -27,8 +34,12 @@ class BranchManager:
return branch
@transaction.atomic
def merge_branches(self, source: VersionBranch, target: VersionBranch,
user: Optional['User'] = None) -> Tuple[bool, List[Dict[str, Any]]]:
def merge_branches(
self,
source: VersionBranch,
target: VersionBranch,
user: Optional[UserModel] = None
) -> Tuple[bool, List[Dict[str, Any]]]:
"""
Merge source branch into target branch
Returns: (success, conflicts)
@@ -65,9 +76,15 @@ class BranchManager:
class ChangeTracker:
"""Tracks and manages changes across the system"""
def record_change(self, instance: Any, change_type: str,
branch: VersionBranch, user: Optional['User'] = None,
metadata: Optional[Dict] = None) -> ChangeSet:
@transaction.atomic
def record_change(
self,
instance: Any,
change_type: str,
branch: VersionBranch,
user: Optional[UserModel] = None,
metadata: Optional[Dict] = None
) -> ChangeSet:
"""Record a change in the system"""
if not hasattr(instance, 'history'):
raise ValueError("Instance must be a model with history tracking enabled")
@@ -100,8 +117,11 @@ class ChangeTracker:
class MergeStrategy:
"""Handles merge operations and conflict resolution"""
def auto_merge(self, source: VersionBranch,
target: VersionBranch) -> Tuple[bool, List[Dict[str, Any]]]:
def auto_merge(
self,
source: VersionBranch,
target: VersionBranch
) -> Tuple[bool, List[Dict[str, Any]]]:
"""
Attempt automatic merge between branches
Returns: (success, conflicts)
@@ -155,8 +175,11 @@ class MergeStrategy:
)
@transaction.atomic
def _apply_change_to_branch(self, change: ChangeSet,
target_branch: VersionBranch) -> None:
def _apply_change_to_branch(
self,
change: ChangeSet,
target_branch: VersionBranch
) -> None:
"""Apply a change from one branch to another"""
# Create new changeset in target branch
new_changeset = ChangeSet.objects.create(