- Fix extra blank line in step file causing lint failure (ruff E302)
- Consolidate duplicate step_when_capture_engine_args and step_when_verify_thread_safe_args
into a shared _run_get_current_revision_and_capture_kwargs() helper
- Remove duplicate Scenario 3 (identical assertion to Scenario 1, different step impl)
- Unify context attribute name to engine_creation_kwargs across all steps
- Add explicit type annotations to all step function signatures
MigrationRunner.get_current_revision() was creating a SQLAlchemy engine
with create_engine(self.database_url) without passing
connect_args={"check_same_thread": False} for SQLite databases. When
called from a background thread (e.g. async startup flows), SQLite raised
ProgrammingError: SQLite objects created in a thread can only be used in
that same thread.
The sibling method init_or_upgrade() already passes check_same_thread=False
for SQLite, making this an inconsistency in the same class. Because
get_pending_migrations() and check_migrations_needed() both delegate to
get_current_revision(), the threading bug propagated to all three methods.
This fix adds connect_args={"check_same_thread": False} to the
create_engine() call in get_current_revision() when the database URL
starts with "sqlite", consistent with the existing pattern in
init_or_upgrade().
ISSUES CLOSED: #10507