Files
SlabUploader/backend/alembic/env.py
T
grokbot_ty e5514fe3bf feat(#27): Gate B [07/10]: FastAPI health endpoint + app factory (H-1)
- 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)
2026-09-07 07:53:36 +00:00

66 lines
1.7 KiB
Python

"""Alembic environment configuration.
Sets up sys.path so that app packages are importable when running
alembic from the backend directory.
Alembic uses sync connections for migrations even with an async app.
"""
import os
import sys
# Ensure the backend root is on the path so app.* is importable
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from logging.config import fileConfig
from alembic import context
from sqlalchemy import engine_from_config, pool
# Import models so that Base.metadata includes all tables
from app.db.models import Base
config = context.config
fileConfig(config.config_file_name)
def run_migrations_online() -> None:
"""Run migrations in 'online' mode using sync engine."""
connectable = engine_from_config(
config.get_section(config.config_ini_section),
prefix="sqlalchemy.",
poolclass=pool.NullPool,
)
with connectable.connect() as connection:
context.configure(
connection=connection,
target_metadata=Base.metadata,
render_as_batch=True,
)
with context.begin_transaction():
context.run_migrations()
connectable.dispose()
def run_migrations_offline() -> None:
"""Run migrations in 'offline' mode."""
url = config.get_main_option("sqlalchemy.url")
context.configure(
url=url,
target_metadata=Base.metadata,
render_as_batch=True,
literal_binds=True,
dialect_opts={"paramstyle": "batch"},
)
with context.begin_transaction():
context.run_migrations()
if context.is_offline_mode():
run_migrations_offline()
else:
run_migrations_online()