From 8046f8422090f337a725743f38c4cdea85e5ac4e Mon Sep 17 00:00:00 2001 From: sobolevn Date: Wed, 15 Jan 2025 22:50:54 +0300 Subject: [PATCH 1/6] Improve `django-import-export` --- pyrightconfig.stricter.json | 1 - .../import_export/tmp_storages.pyi | 12 ++++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/pyrightconfig.stricter.json b/pyrightconfig.stricter.json index 18439b1b27cd..5d2fdedc76a2 100644 --- a/pyrightconfig.stricter.json +++ b/pyrightconfig.stricter.json @@ -44,7 +44,6 @@ "stubs/corus", "stubs/dateparser", "stubs/defusedxml", - "stubs/django-import-export", "stubs/docker", "stubs/docutils", "stubs/Flask-SocketIO", diff --git a/stubs/django-import-export/import_export/tmp_storages.pyi b/stubs/django-import-export/import_export/tmp_storages.pyi index ddab041ee2a9..5d9fc3803b44 100644 --- a/stubs/django-import-export/import_export/tmp_storages.pyi +++ b/stubs/django-import-export/import_export/tmp_storages.pyi @@ -1,3 +1,4 @@ +from abc import abstractmethod from typing import IO, Any, ClassVar class BaseStorage: @@ -5,13 +6,16 @@ class BaseStorage: read_mode: str encoding: str | None def __init__(self, *, name: str | None = None, read_mode: str = "", encoding: str | None = None) -> None: ... + @abstractmethod def save(self, data: Any) -> None: ... - def read(self) -> None: ... + @abstractmethod + def read(self) -> Any: ... + @abstractmethod def remove(self) -> None: ... class TempFolderStorage(BaseStorage): def save(self, data: Any) -> None: ... - def read(self): ... + def read(self) -> Any: ... def remove(self) -> None: ... def get_full_path(self) -> str: ... @@ -19,12 +23,12 @@ class CacheStorage(BaseStorage): CACHE_LIFETIME: int CACHE_PREFIX: str def save(self, data: Any) -> None: ... - def read(self): ... + def read(self) -> Any: ... def remove(self) -> None: ... class MediaStorage(BaseStorage): MEDIA_FOLDER: ClassVar[str] def save(self, data: IO[Any]) -> None: ... - def read(self): ... + def read(self) -> Any: ... def remove(self) -> None: ... def get_full_path(self) -> str: ... From 620583422ceb749ec58b2e25d3672daca08fb2c5 Mon Sep 17 00:00:00 2001 From: sobolevn Date: Wed, 15 Jan 2025 23:03:59 +0300 Subject: [PATCH 2/6] Add missing types --- stubs/django-import-export/import_export/admin.pyi | 2 +- stubs/django-import-export/import_export/resources.pyi | 10 ++++++---- stubs/django-import-export/import_export/results.pyi | 2 +- stubs/django-import-export/import_export/widgets.pyi | 6 +++--- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/stubs/django-import-export/import_export/admin.pyi b/stubs/django-import-export/import_export/admin.pyi index 9805df5cdc79..6578d569f8b8 100644 --- a/stubs/django-import-export/import_export/admin.pyi +++ b/stubs/django-import-export/import_export/admin.pyi @@ -105,7 +105,7 @@ class ImportExportModelAdmin(ImportExportMixin[_ModelT], admin.ModelAdmin[_Model class ExportActionMixin(ExportMixin[_ModelT]): action_form: type[ActionForm] def __init__(self, *args: Any, **kwargs: Any) -> None: ... - def export_admin_action(self, request: HttpRequest, queryset: QuerySet[_ModelT]): ... + def export_admin_action(self, request: HttpRequest, queryset: QuerySet[_ModelT]) -> HttpResponse: ... def get_actions(self, request: HttpRequest) -> dict[str, tuple[Callable[..., str], str, str] | None]: ... @property def media(self) -> Media: ... diff --git a/stubs/django-import-export/import_export/resources.pyi b/stubs/django-import-export/import_export/resources.pyi index 3aad1cae9f72..a9a95e502a25 100644 --- a/stubs/django-import-export/import_export/resources.pyi +++ b/stubs/django-import-export/import_export/resources.pyi @@ -6,6 +6,8 @@ from logging import Logger from typing import Any, ClassVar, Generic, Literal, NoReturn, TypeVar, overload from typing_extensions import TypeAlias, deprecated +import _typeshed + from django.db.models import Field as DjangoField, ForeignObjectRel, Model, QuerySet from django.utils.safestring import SafeString @@ -47,7 +49,7 @@ class ResourceOptions(Generic[_ModelT]): use_natural_foreign_keys: bool class DeclarativeMetaclass(type): - def __new__(cls, name: str, bases: tuple[type[Any], ...], attrs: dict[str, Any]): ... + def __new__(cls: type[_typeshed.Self], name: str, bases: tuple[type[Any], ...], attrs: dict[str, Any]) -> _typeshed.Self: ... class Diff: left: list[str] @@ -202,7 +204,7 @@ class Resource(Generic[_ModelT], metaclass=DeclarativeMetaclass): def export(self, *args: Any, queryset: QuerySet[_ModelT] | None = None, **kwargs: Any) -> Dataset: ... class ModelDeclarativeMetaclass(DeclarativeMetaclass): - def __new__(cls, name: str, bases: tuple[type[Any], ...], attrs: dict[str, Any]): ... + def __new__(cls: type[_typeshed.Self], name: str, bases: tuple[type[Any], ...], attrs: dict[str, Any]) -> _typeshed.Self: ... class ModelResource(Resource[_ModelT], metaclass=ModelDeclarativeMetaclass): DEFAULT_RESOURCE_FIELD: ClassVar[type[Field]] = ... @@ -212,13 +214,13 @@ class ModelResource(Resource[_ModelT], metaclass=ModelDeclarativeMetaclass): @classmethod def get_fk_widget(cls, field: DjangoField[Any, Any]) -> partial[ForeignKeyWidget[Any]]: ... @classmethod - def widget_from_django_field(cls, f: DjangoField[Any, Any], default: type[Widget] = ...): ... + def widget_from_django_field(cls, f: DjangoField[Any, Any], default: type[Widget] = ...) -> type[Widget]: ... @classmethod def widget_kwargs_for_field(self, field_name: str) -> dict[str, Any]: ... @classmethod def field_from_django_field(cls, field_name: str, django_field: DjangoField[Any, Any], readonly: bool) -> Field: ... def get_queryset(self) -> QuerySet[_ModelT]: ... - def init_instance(self, row: dict[str, Any] | None = None): ... + def init_instance(self, row: dict[str, Any] | None = None) -> _ModelT: ... def after_import(self, dataset: Dataset, result: Result, using_transactions: bool, dry_run: bool, **kwargs: Any) -> None: ... @classmethod def get_display_name(cls) -> str: ... diff --git a/stubs/django-import-export/import_export/results.pyi b/stubs/django-import-export/import_export/results.pyi index 249cb31fae20..dd50fd7e7e39 100644 --- a/stubs/django-import-export/import_export/results.pyi +++ b/stubs/django-import-export/import_export/results.pyi @@ -64,7 +64,7 @@ class Result: def append_row_result(self, row_result: RowResult) -> None: ... def append_base_error(self, error: Error) -> None: ... def add_dataset_headers(self, headers: list[str] | None) -> None: ... - def append_failed_row(self, row: dict[str, Any], error) -> None: ... + def append_failed_row(self, row: dict[str, Any], error: Exception) -> None: ... def append_invalid_row(self, number: int, row: dict[str, Any], validation_error: ValidationError) -> None: ... def increment_row_result_total(self, row_result: RowResult) -> None: ... def row_errors(self) -> list[tuple[int, Any]]: ... diff --git a/stubs/django-import-export/import_export/widgets.pyi b/stubs/django-import-export/import_export/widgets.pyi index 58d7cae69917..e91d2a424124 100644 --- a/stubs/django-import-export/import_export/widgets.pyi +++ b/stubs/django-import-export/import_export/widgets.pyi @@ -59,8 +59,8 @@ class ForeignKeyWidget(Widget, Generic[_ModelT]): def __init__(self, model: _ModelT, field: str = "pk", use_natural_foreign_keys: bool = False, **kwargs: Any) -> None: ... def get_queryset(self, value: Any, row: Mapping[str, Any], *args: Any, **kwargs: Any) -> QuerySet[_ModelT]: ... -class ManyToManyWidget(Widget): - model: Model +class ManyToManyWidget(Widget, Generic[_ModelT]): + model: _ModelT separator: str field: str - def __init__(self, model, separator: str | None = None, field: str | None = None, **kwargs: Any) -> None: ... + def __init__(self, model: _ModelT, separator: str | None = None, field: str | None = None, **kwargs: Any) -> None: ... From 3f3a3a36a95decda8ca84c3f3851fb053be40078 Mon Sep 17 00:00:00 2001 From: sobolevn Date: Wed, 15 Jan 2025 23:06:04 +0300 Subject: [PATCH 3/6] Add missing types --- stubs/django-import-export/import_export/resources.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stubs/django-import-export/import_export/resources.pyi b/stubs/django-import-export/import_export/resources.pyi index a9a95e502a25..1aaa4039c964 100644 --- a/stubs/django-import-export/import_export/resources.pyi +++ b/stubs/django-import-export/import_export/resources.pyi @@ -210,7 +210,7 @@ class ModelResource(Resource[_ModelT], metaclass=ModelDeclarativeMetaclass): DEFAULT_RESOURCE_FIELD: ClassVar[type[Field]] = ... WIDGETS_MAP: ClassVar[dict[str, type[Widget]]] @classmethod - def get_m2m_widget(cls, field: DjangoField[Any, Any]) -> partial[ManyToManyWidget]: ... + def get_m2m_widget(cls, field: DjangoField[Any, Any]) -> partial[ManyToManyWidget[Any]]: ... @classmethod def get_fk_widget(cls, field: DjangoField[Any, Any]) -> partial[ForeignKeyWidget[Any]]: ... @classmethod From f11e634c6a10b63ec7b24673a7dad901bd152a9d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 15 Jan 2025 20:08:01 +0000 Subject: [PATCH 4/6] [pre-commit.ci] auto fixes from pre-commit.com hooks --- stubs/django-import-export/import_export/resources.pyi | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/stubs/django-import-export/import_export/resources.pyi b/stubs/django-import-export/import_export/resources.pyi index 1aaa4039c964..6bce4ab0f10f 100644 --- a/stubs/django-import-export/import_export/resources.pyi +++ b/stubs/django-import-export/import_export/resources.pyi @@ -1,3 +1,4 @@ +import _typeshed from _typeshed import Incomplete from collections import OrderedDict from collections.abc import Iterator, Sequence @@ -6,8 +7,6 @@ from logging import Logger from typing import Any, ClassVar, Generic, Literal, NoReturn, TypeVar, overload from typing_extensions import TypeAlias, deprecated -import _typeshed - from django.db.models import Field as DjangoField, ForeignObjectRel, Model, QuerySet from django.utils.safestring import SafeString From 286c2a62e143a02b9a9cec330f8ef933f1d3cb1a Mon Sep 17 00:00:00 2001 From: sobolevn Date: Wed, 15 Jan 2025 23:11:09 +0300 Subject: [PATCH 5/6] Remove import --- stubs/django-import-export/import_export/resources.pyi | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/stubs/django-import-export/import_export/resources.pyi b/stubs/django-import-export/import_export/resources.pyi index 6bce4ab0f10f..895b430ccf9d 100644 --- a/stubs/django-import-export/import_export/resources.pyi +++ b/stubs/django-import-export/import_export/resources.pyi @@ -1,5 +1,4 @@ import _typeshed -from _typeshed import Incomplete from collections import OrderedDict from collections.abc import Iterator, Sequence from functools import partial @@ -15,7 +14,7 @@ from .instance_loaders import BaseInstanceLoader from .results import Error, Result, RowResult from .widgets import ForeignKeyWidget, ManyToManyWidget, Widget -Dataset: TypeAlias = Incomplete # tablib.Dataset +Dataset: TypeAlias = _typeshed.Incomplete # tablib.Dataset logger: Logger @overload From 2f9390e9471a1987de8841ade75b9601273e62a4 Mon Sep 17 00:00:00 2001 From: sobolevn Date: Thu, 16 Jan 2025 16:05:28 +0300 Subject: [PATCH 6/6] Address review --- stubs/django-import-export/import_export/tmp_storages.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stubs/django-import-export/import_export/tmp_storages.pyi b/stubs/django-import-export/import_export/tmp_storages.pyi index 5d9fc3803b44..eda138ffda97 100644 --- a/stubs/django-import-export/import_export/tmp_storages.pyi +++ b/stubs/django-import-export/import_export/tmp_storages.pyi @@ -9,7 +9,7 @@ class BaseStorage: @abstractmethod def save(self, data: Any) -> None: ... @abstractmethod - def read(self) -> Any: ... + def read(self) -> Any: ... # `Any` because `read` returns things from `save` @abstractmethod def remove(self) -> None: ...