Add helper functions for Version
This commit is contained in:
parent
030de44dd2
commit
9d52773794
128
helpers/version_helpers.py
Normal file
128
helpers/version_helpers.py
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
from typing import Optional, Dict, Union
|
||||||
|
import re
|
||||||
|
from datetime import datetime
|
||||||
|
from sqlalchemy.orm import Session
|
||||||
|
from models.version import Version
|
||||||
|
from schemas.version import VersionCreate, VersionUpdate
|
||||||
|
|
||||||
|
def validate_version_number(version_number: str) -> bool:
|
||||||
|
"""
|
||||||
|
Validate version number format (e.g., 1.0.0, 2.1.3)
|
||||||
|
|
||||||
|
Args:
|
||||||
|
version_number: Version number string to validate
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
bool: True if version format is valid, False otherwise
|
||||||
|
"""
|
||||||
|
pattern = r'^\d+\.\d+\.\d+$'
|
||||||
|
return bool(re.match(pattern, version_number))
|
||||||
|
|
||||||
|
def parse_version_components(version_number: str) -> Dict[str, int]:
|
||||||
|
"""
|
||||||
|
Parse version number into major, minor and patch components
|
||||||
|
|
||||||
|
Args:
|
||||||
|
version_number: Version number string (e.g. '1.2.3')
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Dict containing major, minor and patch numbers
|
||||||
|
"""
|
||||||
|
major, minor, patch = version_number.split('.')
|
||||||
|
return {
|
||||||
|
'major': int(major),
|
||||||
|
'minor': int(minor),
|
||||||
|
'patch': int(patch)
|
||||||
|
}
|
||||||
|
|
||||||
|
def compare_versions(version1: str, version2: str) -> int:
|
||||||
|
"""
|
||||||
|
Compare two version numbers
|
||||||
|
|
||||||
|
Args:
|
||||||
|
version1: First version number
|
||||||
|
version2: Second version number
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
1 if version1 > version2
|
||||||
|
-1 if version1 < version2
|
||||||
|
0 if version1 == version2
|
||||||
|
"""
|
||||||
|
v1_components = parse_version_components(version1)
|
||||||
|
v2_components = parse_version_components(version2)
|
||||||
|
|
||||||
|
for component in ['major', 'minor', 'patch']:
|
||||||
|
if v1_components[component] > v2_components[component]:
|
||||||
|
return 1
|
||||||
|
elif v1_components[component] < v2_components[component]:
|
||||||
|
return -1
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def get_latest_version(db: Session) -> Optional[Version]:
|
||||||
|
"""
|
||||||
|
Get the latest version from database
|
||||||
|
|
||||||
|
Args:
|
||||||
|
db: Database session
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Latest Version object if exists, None otherwise
|
||||||
|
"""
|
||||||
|
return db.query(Version).order_by(Version.version_number.desc()).first()
|
||||||
|
|
||||||
|
def create_version_safely(db: Session, version_data: VersionCreate) -> Union[Version, Dict[str, str]]:
|
||||||
|
"""
|
||||||
|
Create a new version with validation and error handling
|
||||||
|
|
||||||
|
Args:
|
||||||
|
db: Database session
|
||||||
|
version_data: Version data for creation
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Version object if created successfully, error dict otherwise
|
||||||
|
"""
|
||||||
|
if not validate_version_number(version_data.version_number):
|
||||||
|
return {"error": "Invalid version number format"}
|
||||||
|
|
||||||
|
existing_version = db.query(Version).filter(
|
||||||
|
Version.version_number == version_data.version_number
|
||||||
|
).first()
|
||||||
|
|
||||||
|
if existing_version:
|
||||||
|
return {"error": "Version already exists"}
|
||||||
|
|
||||||
|
db_version = Version(
|
||||||
|
version_number=version_data.version_number,
|
||||||
|
description=version_data.description
|
||||||
|
)
|
||||||
|
|
||||||
|
db.add(db_version)
|
||||||
|
db.commit()
|
||||||
|
db.refresh(db_version)
|
||||||
|
|
||||||
|
return db_version
|
||||||
|
|
||||||
|
def increment_version(current_version: str, increment_type: str = 'patch') -> str:
|
||||||
|
"""
|
||||||
|
Increment version number based on semantic versioning
|
||||||
|
|
||||||
|
Args:
|
||||||
|
current_version: Current version number
|
||||||
|
increment_type: Type of increment ('major', 'minor', or 'patch')
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
New version number
|
||||||
|
"""
|
||||||
|
components = parse_version_components(current_version)
|
||||||
|
|
||||||
|
if increment_type == 'major':
|
||||||
|
components['major'] += 1
|
||||||
|
components['minor'] = 0
|
||||||
|
components['patch'] = 0
|
||||||
|
elif increment_type == 'minor':
|
||||||
|
components['minor'] += 1
|
||||||
|
components['patch'] = 0
|
||||||
|
else: # patch
|
||||||
|
components['patch'] += 1
|
||||||
|
|
||||||
|
return f"{components['major']}.{components['minor']}.{components['patch']}"
|
Loading…
x
Reference in New Issue
Block a user