From 37e771a22d007fed9fb3083d549dd03dc43e4906 Mon Sep 17 00:00:00 2001 From: Kai Mueller Date: Sat, 22 Oct 2022 10:06:31 +0000 Subject: [PATCH 1/6] Add stubs for flask-migrate As discussed in https://github.com/miguelgrinberg/Flask-Migrate/issues/492 types should be added to typeshed. --- pyrightconfig.stricter.json | 1 + stubs/Flask-Migrate/METADATA.toml | 2 + .../Flask-Migrate/flask_migrate/__init__.pyi | 87 +++++++++++++++++++ 3 files changed, 90 insertions(+) create mode 100644 stubs/Flask-Migrate/METADATA.toml create mode 100644 stubs/Flask-Migrate/flask_migrate/__init__.pyi diff --git a/pyrightconfig.stricter.json b/pyrightconfig.stricter.json index ec0b2380e22f..e8e9d5ae3e70 100644 --- a/pyrightconfig.stricter.json +++ b/pyrightconfig.stricter.json @@ -37,6 +37,7 @@ "stubs/cryptography", "stubs/dateparser", "stubs/docutils", + "stubs/Flask-Migrate", "stubs/Flask-SQLAlchemy", "stubs/fpdf2", "stubs/html5lib", diff --git a/stubs/Flask-Migrate/METADATA.toml b/stubs/Flask-Migrate/METADATA.toml new file mode 100644 index 000000000000..97488d71e585 --- /dev/null +++ b/stubs/Flask-Migrate/METADATA.toml @@ -0,0 +1,2 @@ +version = "4.0.*" +requires = ["types-Flask-SQLAlchemy", "types-SQLAlchemy"] diff --git a/stubs/Flask-Migrate/flask_migrate/__init__.pyi b/stubs/Flask-Migrate/flask_migrate/__init__.pyi new file mode 100644 index 000000000000..d8dc5f07d268 --- /dev/null +++ b/stubs/Flask-Migrate/flask_migrate/__init__.pyi @@ -0,0 +1,87 @@ +from collections.abc import Callable +from logging import Logger +from typing import Any, TypeVar +from typing_extensions import ParamSpec + +from flask_sqlalchemy import SQLAlchemy +from sqlalchemy import MetaData + +_T = TypeVar("_T") +_P = ParamSpec("_P") +_App = Any # flask.Flask is not possible as a dependency yet + +alembic_version: tuple[int, int, int] +log: Logger + +class _MigrateConfig: + migrate: Migrate + db: SQLAlchemy | None + directory: str + configure_args: dict[str, Any] + def __init__(self, migrate: Migrate, db: SQLAlchemy | None, **kwargs) -> None: ... + @property + def metadata(self) -> MetaData: ... + +class Config: # should inherit from alembic.config.Config which is not possible yet + template_directory: str | None + def __init__(self, *args, **kwargs) -> None: ... + def get_template_directory(self) -> str: ... + +class Migrate: + configure_callbacks: list[Callable[[Config], None]] + db: SQLAlchemy | None + directory: str + alembic_ctx_kwargs: dict[str, Any] + def __init__(self, app: _App | None = ..., db: SQLAlchemy | None = ..., directory: str = ..., **kwargs) -> None: ... + def init_app(self, app: _App, db: SQLAlchemy | None = ..., directory: str | None = ..., **kwargs) -> None: ... + def configure(self, f: Callable[[Config], None]) -> Callable[[Config], None]: ... + def call_configure_callbacks(self, config: Config): ... + def get_config(self, directory: str | None = ..., x_arg: tuple[str] | None = ..., opts: list[str] | None = ...): ... + +def catch_errors(f: Callable[_P, _T]) -> Callable[_P, _T]: ... +def list_templates() -> None: ... +def init(directory: str | None = ..., multidb: bool = ..., template: str | None = ..., package: bool = ...) -> None: ... +def revision( + directory: str | None = ..., + message: str | None = ..., + autogenerate: bool = ..., + sql: bool = ..., + head: str = ..., + splice: bool = ..., + branch_label: str | None = ..., + version_path: str | None = ..., + rev_id: str | None = ..., +) -> None: ... +def migrate( + directory: str | None = ..., + message: str | None = ..., + sql: bool = ..., + head: str = ..., + splice: bool = ..., + branch_label: str | None = ..., + version_path: str | None = ..., + rev_id: str | None = ..., + x_arg: tuple[str] | None = ..., +) -> None: ... +def edit(directory: str | None = ..., revision: str = ...) -> None: ... +def merge( + directory: str | None = ..., + revisions: str = ..., + message: str | None = ..., + branch_label: str | None = ..., + rev_id: str | None = ..., +) -> None: ... +def upgrade( + directory: str | None = ..., revision: str = ..., sql: bool = ..., tag: str | None = ..., x_arg: tuple[str] | None = ... +) -> None: ... +def downgrade( + directory: str | None = ..., revision: str = ..., sql: bool = ..., tag: str | None = ..., x_arg: tuple[str] | None = ... +) -> None: ... +def show(directory: str | None = ..., revision: str = ...) -> None: ... +def history( + directory: str | None = ..., rev_range: str | None = ..., verbose: bool = ..., indicate_current: bool = ... +) -> None: ... +def heads(directory: str | None = ..., verbose: bool = ..., resolve_dependencies: bool = ...) -> None: ... +def branches(directory: str | None = ..., verbose: bool = ...) -> None: ... +def current(directory: str | None = ..., verbose: bool = ...) -> None: ... +def stamp(directory: str | None = ..., revision: str = ..., sql: bool = ..., tag: str | None = ...) -> None: ... From 030359caab05592c4e7c45c0044a6024c7801dec Mon Sep 17 00:00:00 2001 From: Kai Mueller Date: Tue, 22 Nov 2022 07:39:39 +0000 Subject: [PATCH 2/6] Update stubs --- .../Flask-Migrate/flask_migrate/__init__.pyi | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/stubs/Flask-Migrate/flask_migrate/__init__.pyi b/stubs/Flask-Migrate/flask_migrate/__init__.pyi index d8dc5f07d268..ece3a7124fbf 100644 --- a/stubs/Flask-Migrate/flask_migrate/__init__.pyi +++ b/stubs/Flask-Migrate/flask_migrate/__init__.pyi @@ -1,14 +1,14 @@ from collections.abc import Callable from logging import Logger from typing import Any, TypeVar -from typing_extensions import ParamSpec +from typing_extensions import ParamSpec, TypeAlias from flask_sqlalchemy import SQLAlchemy from sqlalchemy import MetaData _T = TypeVar("_T") _P = ParamSpec("_P") -_App = Any # flask.Flask is not possible as a dependency yet +_App: TypeAlias = Any # flask.Flask is not possible as a dependency yet alembic_version: tuple[int, int, int] log: Logger @@ -32,8 +32,26 @@ class Migrate: db: SQLAlchemy | None directory: str alembic_ctx_kwargs: dict[str, Any] - def __init__(self, app: _App | None = ..., db: SQLAlchemy | None = ..., directory: str = ..., **kwargs) -> None: ... - def init_app(self, app: _App, db: SQLAlchemy | None = ..., directory: str | None = ..., **kwargs) -> None: ... + def __init__( + self, + app: _App | None = ..., + db: SQLAlchemy | None = ..., + directory: str = ..., + command: str = ..., + compare_type: bool = ..., + render_as_batch: bool = ..., + **kwargs, + ) -> None: ... + def init_app( + self, + app: _App, + db: SQLAlchemy | None = ..., + directory: str | None = ..., + command: str | None = ..., + compare_type: bool | None = ..., + render_as_batch: bool | None = ..., + **kwargs, + ) -> None: ... def configure(self, f: Callable[[Config], None]) -> Callable[[Config], None]: ... def call_configure_callbacks(self, config: Config): ... def get_config(self, directory: str | None = ..., x_arg: tuple[str] | None = ..., opts: list[str] | None = ...): ... From 51c5e86acd23f337ce2203779d9014737232d292 Mon Sep 17 00:00:00 2001 From: kasium <15907922+kasium@users.noreply.github.com> Date: Tue, 22 Nov 2022 16:58:34 +0100 Subject: [PATCH 3/6] Apply suggestions from code review Co-authored-by: Alex Waygood --- stubs/Flask-Migrate/flask_migrate/__init__.pyi | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/stubs/Flask-Migrate/flask_migrate/__init__.pyi b/stubs/Flask-Migrate/flask_migrate/__init__.pyi index ece3a7124fbf..b38713c4f8f3 100644 --- a/stubs/Flask-Migrate/flask_migrate/__init__.pyi +++ b/stubs/Flask-Migrate/flask_migrate/__init__.pyi @@ -13,15 +13,6 @@ _App: TypeAlias = Any # flask.Flask is not possible as a dependency yet alembic_version: tuple[int, int, int] log: Logger -class _MigrateConfig: - migrate: Migrate - db: SQLAlchemy | None - directory: str - configure_args: dict[str, Any] - def __init__(self, migrate: Migrate, db: SQLAlchemy | None, **kwargs) -> None: ... - @property - def metadata(self) -> MetaData: ... - class Config: # should inherit from alembic.config.Config which is not possible yet template_directory: str | None def __init__(self, *args, **kwargs) -> None: ... @@ -54,7 +45,7 @@ class Migrate: ) -> None: ... def configure(self, f: Callable[[Config], None]) -> Callable[[Config], None]: ... def call_configure_callbacks(self, config: Config): ... - def get_config(self, directory: str | None = ..., x_arg: tuple[str] | None = ..., opts: list[str] | None = ...): ... + def get_config(self, directory: str | None = ..., x_arg: str | Sequence[str] | None = ..., opts: Iterable[str] | None = ...): ... def catch_errors(f: Callable[_P, _T]) -> Callable[_P, _T]: ... def list_templates() -> None: ... @@ -79,7 +70,7 @@ def migrate( branch_label: str | None = ..., version_path: str | None = ..., rev_id: str | None = ..., - x_arg: tuple[str] | None = ..., + x_arg: str | Sequence[str] | None = ..., ) -> None: ... def edit(directory: str | None = ..., revision: str = ...) -> None: ... def merge( @@ -90,10 +81,10 @@ def merge( rev_id: str | None = ..., ) -> None: ... def upgrade( - directory: str | None = ..., revision: str = ..., sql: bool = ..., tag: str | None = ..., x_arg: tuple[str] | None = ... + directory: str | None = ..., revision: str = ..., sql: bool = ..., tag: str | None = ..., x_arg: str | Sequence[str] | None = ... ) -> None: ... def downgrade( - directory: str | None = ..., revision: str = ..., sql: bool = ..., tag: str | None = ..., x_arg: tuple[str] | None = ... + directory: str | None = ..., revision: str = ..., sql: bool = ..., tag: str | None = ..., x_arg: str | Sequence[str] | None = ... ) -> None: ... def show(directory: str | None = ..., revision: str = ...) -> None: ... def history( From b324376b69ac353f9e739553bba7911b3ed72ce2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 22 Nov 2022 16:00:59 +0000 Subject: [PATCH 4/6] [pre-commit.ci] auto fixes from pre-commit.com hooks --- stubs/Flask-Migrate/flask_migrate/__init__.pyi | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/stubs/Flask-Migrate/flask_migrate/__init__.pyi b/stubs/Flask-Migrate/flask_migrate/__init__.pyi index b38713c4f8f3..111f552b6ae3 100644 --- a/stubs/Flask-Migrate/flask_migrate/__init__.pyi +++ b/stubs/Flask-Migrate/flask_migrate/__init__.pyi @@ -4,7 +4,6 @@ from typing import Any, TypeVar from typing_extensions import ParamSpec, TypeAlias from flask_sqlalchemy import SQLAlchemy -from sqlalchemy import MetaData _T = TypeVar("_T") _P = ParamSpec("_P") @@ -45,7 +44,9 @@ class Migrate: ) -> None: ... def configure(self, f: Callable[[Config], None]) -> Callable[[Config], None]: ... def call_configure_callbacks(self, config: Config): ... - def get_config(self, directory: str | None = ..., x_arg: str | Sequence[str] | None = ..., opts: Iterable[str] | None = ...): ... + def get_config( + self, directory: str | None = ..., x_arg: str | Sequence[str] | None = ..., opts: Iterable[str] | None = ... + ): ... def catch_errors(f: Callable[_P, _T]) -> Callable[_P, _T]: ... def list_templates() -> None: ... @@ -81,10 +82,18 @@ def merge( rev_id: str | None = ..., ) -> None: ... def upgrade( - directory: str | None = ..., revision: str = ..., sql: bool = ..., tag: str | None = ..., x_arg: str | Sequence[str] | None = ... + directory: str | None = ..., + revision: str = ..., + sql: bool = ..., + tag: str | None = ..., + x_arg: str | Sequence[str] | None = ..., ) -> None: ... def downgrade( - directory: str | None = ..., revision: str = ..., sql: bool = ..., tag: str | None = ..., x_arg: str | Sequence[str] | None = ... + directory: str | None = ..., + revision: str = ..., + sql: bool = ..., + tag: str | None = ..., + x_arg: str | Sequence[str] | None = ..., ) -> None: ... def show(directory: str | None = ..., revision: str = ...) -> None: ... def history( From 23c8df1febf8657e12913b53bfd2fcf3ffeb6f04 Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Tue, 22 Nov 2022 16:02:08 +0000 Subject: [PATCH 5/6] Add missing imports --- stubs/Flask-Migrate/flask_migrate/__init__.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stubs/Flask-Migrate/flask_migrate/__init__.pyi b/stubs/Flask-Migrate/flask_migrate/__init__.pyi index 111f552b6ae3..2515e8955987 100644 --- a/stubs/Flask-Migrate/flask_migrate/__init__.pyi +++ b/stubs/Flask-Migrate/flask_migrate/__init__.pyi @@ -1,4 +1,4 @@ -from collections.abc import Callable +from collections.abc import Callable, Iterable, Sequence from logging import Logger from typing import Any, TypeVar from typing_extensions import ParamSpec, TypeAlias From f451ad7c9c01b83c9905cda6db66f46a9630437a Mon Sep 17 00:00:00 2001 From: Kai Mueller Date: Tue, 22 Nov 2022 16:04:30 +0000 Subject: [PATCH 6/6] Improve --- stubs/Flask-Migrate/METADATA.toml | 2 +- stubs/Flask-Migrate/flask_migrate/__init__.pyi | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/stubs/Flask-Migrate/METADATA.toml b/stubs/Flask-Migrate/METADATA.toml index 97488d71e585..481bd5554519 100644 --- a/stubs/Flask-Migrate/METADATA.toml +++ b/stubs/Flask-Migrate/METADATA.toml @@ -1,2 +1,2 @@ version = "4.0.*" -requires = ["types-Flask-SQLAlchemy", "types-SQLAlchemy"] +requires = ["types-Flask-SQLAlchemy"] diff --git a/stubs/Flask-Migrate/flask_migrate/__init__.pyi b/stubs/Flask-Migrate/flask_migrate/__init__.pyi index 2515e8955987..b52bb29e8e08 100644 --- a/stubs/Flask-Migrate/flask_migrate/__init__.pyi +++ b/stubs/Flask-Migrate/flask_migrate/__init__.pyi @@ -8,6 +8,7 @@ from flask_sqlalchemy import SQLAlchemy _T = TypeVar("_T") _P = ParamSpec("_P") _App: TypeAlias = Any # flask.Flask is not possible as a dependency yet +_ConfigureCallback: TypeAlias = Callable[[Config], Config] alembic_version: tuple[int, int, int] log: Logger @@ -18,7 +19,7 @@ class Config: # should inherit from alembic.config.Config which is not possible def get_template_directory(self) -> str: ... class Migrate: - configure_callbacks: list[Callable[[Config], None]] + configure_callbacks: list[_ConfigureCallback] db: SQLAlchemy | None directory: str alembic_ctx_kwargs: dict[str, Any] @@ -42,7 +43,7 @@ class Migrate: render_as_batch: bool | None = ..., **kwargs, ) -> None: ... - def configure(self, f: Callable[[Config], None]) -> Callable[[Config], None]: ... + def configure(self, f: _ConfigureCallback) -> _ConfigureCallback: ... def call_configure_callbacks(self, config: Config): ... def get_config( self, directory: str | None = ..., x_arg: str | Sequence[str] | None = ..., opts: Iterable[str] | None = ...