e5514fe3bf
- App factory pattern (FUND-8): create_app() produces fresh app per test
- Logging config (structured, no secrets)
- Config validation: SLAB_AES_KEY required, WOO_BASE_URL HTTPS-only
- GET /api/health returns 200 {status: ok, version, woo_reachable: false}
- SQLite + alembic skeleton: full DATA-MODEL schema, initial migration
- API contract tests via httpx TestClient: 5 cases all green
- test_returns_200, test_returns_ok_status, test_woo_reachable_false
- test_response_shape, test_with_test_client_lifespan (FUND-9/10)
27 lines
673 B
Python
27 lines
673 B
Python
"""Logging configuration."""
|
|
|
|
import logging
|
|
import sys
|
|
|
|
|
|
def configure_logging() -> None:
|
|
"""Configure root logger with structured formatting.
|
|
|
|
Format: ISO-8601 timestamp, level, logger name, message.
|
|
Secrets (AES keys, Woo passwords, inference keys) are never logged.
|
|
"""
|
|
root = logging.getLogger()
|
|
root.setLevel(logging.INFO)
|
|
|
|
handler = logging.StreamHandler(sys.stdout)
|
|
handler.setLevel(logging.INFO)
|
|
|
|
formatter = logging.Formatter(
|
|
"%(asctime)s %(levelname)s %(name)s: %(message)s",
|
|
datefmt="%Y-%m-%dT%H:%M:%S%z",
|
|
)
|
|
handler.setFormatter(formatter)
|
|
|
|
if not root.handlers:
|
|
root.addHandler(handler)
|