Phase 1 of v1.1.1 "Polish" release focusing on production readiness. Implements logging, connection pooling, validation, and error handling. Following specs in docs/design/v1.1.1/developer-qa.md and ADRs 052-055. **Structured Logging** (Q3, ADR-054) - RotatingFileHandler (10MB files, keep 10) - Correlation IDs for request tracing - All print statements replaced with logging - Context-aware correlation IDs (init/request) - Logs written to data/logs/starpunk.log **Database Connection Pooling** (Q2, ADR-053) - Connection pool with configurable size (default: 5) - Request-scoped connections via Flask g object - Pool statistics for monitoring - WAL mode enabled for concurrency - Backward compatible get_db() signature **Configuration Validation** (Q14, ADR-052) - Validates presence and type of all config values - Fail-fast startup with clear error messages - LOG_LEVEL enum validation - Type checking for strings, integers, paths - Non-zero exit status on errors **Centralized Error Handling** (Q4, ADR-055) - Moved handlers to starpunk/errors.py - Micropub spec-compliant JSON errors - HTML templates for browser requests - All errors logged with correlation IDs - MicropubError exception class **Database Module Reorganization** - Moved database.py to database/ package - Separated init.py, pool.py, schema.py - Maintains backward compatibility - Cleaner separation of concerns **Testing** - 580 tests passing - 1 pre-existing flaky test noted - No breaking changes to public API **Documentation** - CHANGELOG.md updated with v1.1.1 entry - Version bumped to 1.1.1 - Implementation report in docs/reports/ 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
45 lines
1.2 KiB
Python
45 lines
1.2 KiB
Python
"""
|
|
Database initialization for StarPunk
|
|
"""
|
|
|
|
import sqlite3
|
|
from pathlib import Path
|
|
from starpunk.database.schema import INITIAL_SCHEMA_SQL
|
|
|
|
|
|
def init_db(app=None):
|
|
"""
|
|
Initialize database schema and run migrations
|
|
|
|
Args:
|
|
app: Flask application instance (optional, for config access)
|
|
"""
|
|
if app:
|
|
db_path = app.config["DATABASE_PATH"]
|
|
logger = app.logger
|
|
else:
|
|
# Fallback to default path
|
|
db_path = Path("./data/starpunk.db")
|
|
logger = None
|
|
|
|
# Ensure parent directory exists
|
|
db_path.parent.mkdir(parents=True, exist_ok=True)
|
|
|
|
# Create database and initial schema
|
|
conn = sqlite3.connect(db_path)
|
|
try:
|
|
conn.executescript(INITIAL_SCHEMA_SQL)
|
|
conn.commit()
|
|
if logger:
|
|
logger.info(f"Database initialized: {db_path}")
|
|
else:
|
|
# Fallback logging when logger not available (e.g., during testing)
|
|
import logging
|
|
logging.getLogger(__name__).info(f"Database initialized: {db_path}")
|
|
finally:
|
|
conn.close()
|
|
|
|
# Run migrations
|
|
from starpunk.migrations import run_migrations
|
|
run_migrations(db_path, logger=logger)
|