from typing import Any, Optional, Tuple, Type

from django.db.backends.sqlite3.schema import DatabaseSchemaEditor
from django.db.migrations.state import ProjectState

from .exceptions import IrreversibleError


class Migration:
    operations: List[Any] = ...
    dependencies: List[Any] = ...
    run_before: List[Any] = ...
    replaces: List[Any] = ...
    initial: Any = ...
    atomic: bool = ...
    name: str = ...
    app_label: str = ...
    def __init__(self, name: str, app_label: str) -> None: ...
    def __eq__(self, other: Migration) -> bool: ...
    def __hash__(self) -> int: ...
    def mutate_state(
        self, project_state: ProjectState, preserve: bool = ...
    ) -> ProjectState: ...
    def apply(
        self,
        project_state: ProjectState,
        schema_editor: DatabaseSchemaEditor,
        collect_sql: bool = ...,
    ) -> ProjectState: ...
    def unapply(
        self,
        project_state: ProjectState,
        schema_editor: DatabaseSchemaEditor,
        collect_sql: bool = ...,
    ) -> ProjectState: ...

class SwappableTuple(tuple):
    setting: str = ...
    def __new__(
        cls: Type[SwappableTuple], value: Tuple[str, str], setting: str
    ) -> SwappableTuple: ...

def swappable_dependency(value: str) -> SwappableTuple: ...
