## Issue #65 - Template Engine Foundation (COMPLETED) - Implement complete TDD8 methodology with 30 comprehensive tests (100% passing) - Add template variable parser with Unicode and dot notation support - Add template rendering engine with strict/lenient modes - Add business document generation (invoices, reports) - Add CLI integration with `markitect template-render` command - Add performance optimization (1000+ variables in <0.1s) ## Critical CLI Regression Fix - Fix broken `markitect --help` due to import path issues in markitect/issues/base.py - Add proper path resolution for domain module accessibility - Add 12 comprehensive CLI integration tests to prevent future regressions - Restore full CLI functionality with 35+ working commands ## Template Engine Architecture - markitect/template/parser.py - Variable parsing with comprehensive validation - markitect/template/engine.py - Template rendering with business logic - markitect/template/__init__.py - Structured package exports - Comprehensive exception hierarchy for robust error handling ## Test Coverage Excellence - 30 Issue #65 tests: parser (9), substitution (14), integration (7) - 12 CLI integration tests for regression prevention - Business scenario validation with real invoice/report generation - Performance benchmarking and error handling validation ## CLI Professional Enhancement - Add template-render command with comprehensive options - Fix import path issues preventing CLI access - Add validation, data checking, output options - Support JSON/YAML data formats with auto-detection ## Business Impact - Transform MarkiTect from document analysis to business automation platform - Enable professional invoice and report generation - Provide robust CLI interface for document workflows - Establish foundation for Epic #64 advanced template features 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
109 lines
2.6 KiB
Python
109 lines
2.6 KiB
Python
"""
|
|
Abstract base class for issue management backends.
|
|
|
|
This module defines the interface that all issue management backends must implement.
|
|
"""
|
|
|
|
from abc import ABC, abstractmethod
|
|
from typing import List, Optional, Dict, Any
|
|
import sys
|
|
from pathlib import Path
|
|
# Add project root to path so domain module can be imported
|
|
project_root = Path(__file__).parent.parent.parent
|
|
if str(project_root) not in sys.path:
|
|
sys.path.insert(0, str(project_root))
|
|
|
|
from domain.issues.models import Issue
|
|
|
|
|
|
class IssueBackend(ABC):
|
|
"""Abstract base class for issue management backends."""
|
|
|
|
def __init__(self, config: Dict[str, Any]):
|
|
"""Initialize backend with configuration."""
|
|
self.config = config
|
|
|
|
@abstractmethod
|
|
def list_issues(self, state: Optional[str] = None) -> List[Issue]:
|
|
"""
|
|
List issues with optional state filter.
|
|
|
|
Args:
|
|
state: Filter by state ('open', 'closed', 'all', or None for all)
|
|
|
|
Returns:
|
|
List of Issue objects
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def get_issue(self, issue_id: str) -> Issue:
|
|
"""
|
|
Get specific issue by ID.
|
|
|
|
Args:
|
|
issue_id: The issue identifier
|
|
|
|
Returns:
|
|
Issue object
|
|
|
|
Raises:
|
|
Exception: If issue not found
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def create_issue(self, title: str, body: str, **kwargs) -> Issue:
|
|
"""
|
|
Create new issue.
|
|
|
|
Args:
|
|
title: Issue title
|
|
body: Issue body/description
|
|
**kwargs: Additional issue properties (labels, assignees, etc.)
|
|
|
|
Returns:
|
|
Created Issue object
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def add_comment(self, issue_id: str, comment: str) -> Dict[str, Any]:
|
|
"""
|
|
Add comment to issue.
|
|
|
|
Args:
|
|
issue_id: The issue identifier
|
|
comment: Comment text
|
|
|
|
Returns:
|
|
Comment metadata (id, timestamp, etc.)
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def close_issue(self, issue_id: str) -> Issue:
|
|
"""
|
|
Close issue.
|
|
|
|
Args:
|
|
issue_id: The issue identifier
|
|
|
|
Returns:
|
|
Updated Issue object with closed state
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def update_issue(self, issue_id: str, **kwargs) -> Issue:
|
|
"""
|
|
Update issue properties.
|
|
|
|
Args:
|
|
issue_id: The issue identifier
|
|
**kwargs: Properties to update (title, body, state, etc.)
|
|
|
|
Returns:
|
|
Updated Issue object
|
|
"""
|
|
pass |