Files
markitect-main/markitect/__version__.py
tegwick ff6b807f3b release: bump version to 0.5.0 with clean TDD-driven editor
This release represents a major milestone in MarkiTect's evolution, featuring a complete rewrite of the editor system using test-driven development principles and clean object-oriented architecture.

Key highlights:
- Clean TDD-driven editor architecture with Section/SectionManager/DOMRenderer classes
- Multiple concurrent section editing with intelligent section splitting
- Four-layer content management system (original, current, pending, editing)
- Enhanced status dialog with repository info and version tracking
- Comprehensive testing framework with separation of concerns
- Elegant slide-in control panel and intelligent auto-sizing textarea
- Complete legacy editor system replacement

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-26 07:53:45 +01:00

123 lines
3.7 KiB
Python

"""
Version information for MarkiTect.
This module provides version and release information for the MarkiTect package.
Version information is sourced from pyproject.toml and git metadata when available.
"""
import os
import subprocess
from pathlib import Path
from typing import Optional
# Base version from pyproject.toml
__version__ = "0.5.0"
def get_git_commit_hash() -> Optional[str]:
"""Get the current git commit hash if available."""
try:
result = subprocess.run(
['git', 'rev-parse', '--short', 'HEAD'],
capture_output=True,
text=True,
check=True,
cwd=Path(__file__).parent.parent
)
return result.stdout.strip()
except (subprocess.CalledProcessError, FileNotFoundError):
return None
def get_git_branch() -> Optional[str]:
"""Get the current git branch if available."""
try:
result = subprocess.run(
['git', 'branch', '--show-current'],
capture_output=True,
text=True,
check=True,
cwd=Path(__file__).parent.parent
)
return result.stdout.strip()
except (subprocess.CalledProcessError, FileNotFoundError):
return None
def get_git_tag() -> Optional[str]:
"""Get the current git tag if available."""
try:
result = subprocess.run(
['git', 'describe', '--tags', '--exact-match'],
capture_output=True,
text=True,
check=True,
cwd=Path(__file__).parent.parent
)
return result.stdout.strip()
except (subprocess.CalledProcessError, FileNotFoundError):
return None
def is_development_version() -> bool:
"""Check if this is a development version (has uncommitted changes)."""
try:
result = subprocess.run(
['git', 'status', '--porcelain'],
capture_output=True,
text=True,
check=True,
cwd=Path(__file__).parent.parent
)
return bool(result.stdout.strip())
except (subprocess.CalledProcessError, FileNotFoundError):
return False
def get_version_info() -> dict:
"""Get comprehensive version information."""
git_commit = get_git_commit_hash()
git_branch = get_git_branch()
git_tag = get_git_tag()
is_dev = is_development_version()
# Build version string
version_parts = [__version__]
if git_tag and git_tag != f"v{__version__}":
# If we have a different tag, use it
version_parts = [git_tag.lstrip('v')]
if git_commit:
if is_dev:
version_parts.append(f"dev+{git_commit}")
elif not git_tag:
version_parts.append(f"+{git_commit}")
if is_dev and not git_commit:
version_parts.append("dev")
full_version = ".".join(version_parts)
return {
"version": __version__,
"full_version": full_version,
"git_commit": git_commit,
"git_branch": git_branch,
"git_tag": git_tag,
"is_development": is_dev,
"is_git_repo": git_commit is not None
}
def get_release_info() -> dict:
"""Get release information."""
version_info = get_version_info()
release_type = "development" if version_info["is_development"] else "release"
if version_info["git_tag"]:
release_type = "tagged-release"
elif version_info["git_commit"] and not version_info["is_development"]:
release_type = "commit-build"
return {
"release_type": release_type,
"build_from": version_info["git_branch"] or "unknown",
"commit": version_info["git_commit"] or "unknown",
"clean_build": not version_info["is_development"],
**version_info
}