feat: Implement Issue #1 - Database initialization and front matter parsing
Complete TDD implementation of core MarkiTect functionality: **Database Module (markitect/database.py):** - DatabaseManager class with SQLite database initialization - markdown_files table with proper schema (id, filename, front_matter, content, created_at) - Front matter storage as JSON with content separation - File storage, retrieval, and listing methods - Comprehensive error handling **Front Matter Module (markitect/frontmatter.py):** - FrontMatterParser class with YAML front matter parsing - Clean separation of metadata from markdown content - Graceful handling of invalid YAML and missing front matter - Regex-based parsing with proper delimiter handling **Dependencies:** - Added PyYAML for front matter parsing - Updated pyproject.toml with new dependency **Test Coverage:** - 9 comprehensive tests covering all functionality - Database initialization and schema validation - Front matter parsing with Issue #1 example content - Integrated workflow testing (storage/retrieval) - Error handling for edge cases **TDD Process:** - RED phase: 8 failing tests defining requirements - GREEN phase: Minimal implementation making all tests pass - Validation: Complete workflow verified with example content This implementation provides the foundation for all subsequent MarkiTect features, handling the exact example from Issue #1 specification. Issue #1: Initialize Database and Store Example Markdown File coulomb/markitect_project#1 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
60
markitect/frontmatter.py
Normal file
60
markitect/frontmatter.py
Normal file
@@ -0,0 +1,60 @@
|
||||
"""
|
||||
Front matter parsing functionality for MarkiTect.
|
||||
|
||||
This module provides YAML front matter parsing for markdown files,
|
||||
separating metadata from content.
|
||||
"""
|
||||
|
||||
import re
|
||||
import yaml
|
||||
from typing import Dict, Tuple, Any
|
||||
|
||||
|
||||
class FrontMatterParser:
|
||||
"""Parser for YAML front matter in markdown files."""
|
||||
|
||||
def __init__(self):
|
||||
"""Initialize the front matter parser."""
|
||||
pass
|
||||
|
||||
def parse(self, content: str) -> Tuple[Dict[str, Any], str]:
|
||||
"""
|
||||
Parse front matter from markdown content.
|
||||
|
||||
Args:
|
||||
content: Raw markdown content that may include YAML front matter
|
||||
|
||||
Returns:
|
||||
Tuple of (front_matter_dict, markdown_content)
|
||||
- front_matter_dict: Parsed YAML as dictionary, empty dict if none
|
||||
- markdown_content: Markdown content with front matter removed
|
||||
"""
|
||||
if not content.strip():
|
||||
return {}, content
|
||||
|
||||
# Check if content starts with front matter delimiter
|
||||
if not content.strip().startswith('---'):
|
||||
return {}, content
|
||||
|
||||
# Pattern to match YAML front matter
|
||||
# Must start with --- at beginning of string, end with --- on its own line
|
||||
pattern = r'^---\s*\n(.*?)\n---\s*\n(.*)$'
|
||||
match = re.match(pattern, content, re.DOTALL)
|
||||
|
||||
if not match:
|
||||
# No valid front matter found
|
||||
return {}, content
|
||||
|
||||
yaml_content = match.group(1)
|
||||
markdown_content = match.group(2)
|
||||
|
||||
# Parse YAML content
|
||||
try:
|
||||
front_matter = yaml.safe_load(yaml_content)
|
||||
if front_matter is None:
|
||||
front_matter = {}
|
||||
except yaml.YAMLError:
|
||||
# Invalid YAML - return empty dict and preserve content
|
||||
front_matter = {}
|
||||
|
||||
return front_matter, markdown_content
|
||||
Reference in New Issue
Block a user