From 3d8d412b89a8d38349b72ec4253e35e7185ad18f Mon Sep 17 00:00:00 2001 From: Emmanuel Ferdman Date: Fri, 27 Mar 2026 17:53:51 +0300 Subject: [PATCH 1/3] [docker] Fix incomplete types in models and add missing method Signed-off-by: Emmanuel Ferdman --- stubs/docker/docker/models/containers.pyi | 79 ++++++++++--------- stubs/docker/docker/models/plugins.pyi | 21 +++-- .../docker/transport/basehttpadapter.pyi | 13 +++ 3 files changed, 67 insertions(+), 46 deletions(-) diff --git a/stubs/docker/docker/models/containers.pyi b/stubs/docker/docker/models/containers.pyi index 4bb709249df7..4eaeba94c20c 100644 --- a/stubs/docker/docker/models/containers.pyi +++ b/stubs/docker/docker/models/containers.pyi @@ -1,10 +1,10 @@ import datetime from _io import _BufferedReaderStream -from _typeshed import Incomplete from collections.abc import Iterable, Iterator, Mapping from socket import SocketIO -from typing import Literal, NamedTuple, TypedDict, overload, type_check_only -from typing_extensions import NotRequired +from typing import Any, Literal, NamedTuple, TypedDict, overload, type_check_only + +from typing_extensions import NotRequired, override from docker._types import ContainerWeightDevice, WaitContainerResponse from docker.transport.sshconn import SSHSocket @@ -38,7 +38,7 @@ class Container(Model): @property def health(self) -> str: ... @property - def ports(self) -> dict[Incomplete, Incomplete]: ... + def ports(self) -> dict[str, list[dict[str, str]] | None]: ... @overload def attach( self, @@ -75,7 +75,7 @@ class Container(Model): ) -> CancellableStream[tuple[bytes | None, bytes | None]]: ... def attach_socket(self, **kwargs) -> SocketIO | _BufferedReaderStream | SSHSocket: ... def commit(self, repository: str | None = None, tag: str | None = None, **kwargs) -> Image: ... - def diff(self) -> list[dict[str, Incomplete]]: ... + def diff(self) -> list[dict[str, int | str]]: ... def exec_run( self, cmd: str | list[str], @@ -95,7 +95,7 @@ class Container(Model): def export(self, chunk_size: int | None = 2097152) -> str: ... def get_archive( self, path: str, chunk_size: int | None = 2097152, encode_stream: bool = False - ) -> tuple[Incomplete, Incomplete]: ... + ) -> tuple[Iterator[bytes], dict[str, Any] | None]: ... def kill(self, signal: str | int | None = None) -> None: ... @overload def logs( @@ -130,7 +130,7 @@ class Container(Model): def resize(self, height: int, width: int) -> None: ... def restart(self, *, timeout: float | None = 10) -> None: ... def start(self) -> None: ... - def stats(self, **kwargs) -> Iterator[dict[str, Incomplete]] | dict[str, Incomplete]: ... + def stats(self, **kwargs) -> Iterator[dict[str, Any]] | dict[str, Any]: ... def stop(self, *, timeout: float | None = None) -> None: ... def top(self, *, ps_args: str | None = None) -> _TopResult: ... def unpause(self) -> None: ... @@ -181,22 +181,22 @@ class ContainerCollection(Collection[Container]): cpuset_cpus: str | None = None, cpuset_mems: str | None = None, detach: Literal[False] = False, - device_cgroup_rules: list[Incomplete] | None = None, + device_cgroup_rules: list[str] | None = None, device_read_bps: list[Mapping[str, str | int]] | None = None, device_read_iops: list[Mapping[str, str | int]] | None = None, device_write_bps: list[Mapping[str, str | int]] | None = None, device_write_iops: list[Mapping[str, str | int]] | None = None, devices: list[str] | None = None, device_requests: list[DeviceRequest] | None = None, - dns: list[Incomplete] | None = None, - dns_opt: list[Incomplete] | None = None, - dns_search: list[Incomplete] | None = None, - domainname: str | list[Incomplete] | None = None, + dns: list[str] | None = None, + dns_opt: list[str] | None = None, + dns_search: list[str] | None = None, + domainname: str | list[str] | None = None, entrypoint: str | list[str] | None = None, environment: dict[str, str] | list[str] | None = None, extra_hosts: dict[str, str] | None = None, group_add: Iterable[str | int] | None = None, - healthcheck: dict[Incomplete, Incomplete] | None = None, + healthcheck: dict[str, Any] | None = None, hostname: str | None = None, init: bool | None = None, init_path: str | None = None, @@ -206,7 +206,7 @@ class ContainerCollection(Collection[Container]): labels: dict[str, str] | list[str] | None = None, links: dict[str, str] | dict[str, None] | dict[str, str | None] | Iterable[tuple[str, str | None]] | None = None, log_config: LogConfig | None = None, - lxc_conf: dict[Incomplete, Incomplete] | None = None, + lxc_conf: dict[str, str] | None = None, mac_address: str | None = None, mem_limit: str | int | None = None, mem_reservation: str | int | None = None, @@ -234,9 +234,9 @@ class ContainerCollection(Collection[Container]): shm_size: str | int | None = None, stdin_open: bool = False, stop_signal: str | None = None, - storage_opt: dict[Incomplete, Incomplete] | None = None, + storage_opt: dict[str, str] | None = None, stream: bool = False, - sysctls: dict[Incomplete, Incomplete] | None = None, + sysctls: dict[str, str] | None = None, tmpfs: dict[str, str] | None = None, tty: bool = False, ulimits: list[Ulimit] | None = None, @@ -276,22 +276,22 @@ class ContainerCollection(Collection[Container]): cpuset_cpus: str | None = None, cpuset_mems: str | None = None, detach: Literal[True], - device_cgroup_rules: list[Incomplete] | None = None, + device_cgroup_rules: list[str] | None = None, device_read_bps: list[Mapping[str, str | int]] | None = None, device_read_iops: list[Mapping[str, str | int]] | None = None, device_write_bps: list[Mapping[str, str | int]] | None = None, device_write_iops: list[Mapping[str, str | int]] | None = None, devices: list[str] | None = None, device_requests: list[DeviceRequest] | None = None, - dns: list[Incomplete] | None = None, - dns_opt: list[Incomplete] | None = None, - dns_search: list[Incomplete] | None = None, - domainname: str | list[Incomplete] | None = None, + dns: list[str] | None = None, + dns_opt: list[str] | None = None, + dns_search: list[str] | None = None, + domainname: str | list[str] | None = None, entrypoint: str | list[str] | None = None, environment: dict[str, str] | list[str] | None = None, extra_hosts: dict[str, str] | None = None, group_add: Iterable[str | int] | None = None, - healthcheck: dict[Incomplete, Incomplete] | None = None, + healthcheck: dict[str, Any] | None = None, hostname: str | None = None, init: bool | None = None, init_path: str | None = None, @@ -301,7 +301,7 @@ class ContainerCollection(Collection[Container]): labels: dict[str, str] | list[str] | None = None, links: dict[str, str] | dict[str, None] | dict[str, str | None] | Iterable[tuple[str, str | None]] | None = None, log_config: LogConfig | None = None, - lxc_conf: dict[Incomplete, Incomplete] | None = None, + lxc_conf: dict[str, str] | None = None, mac_address: str | None = None, mem_limit: str | int | None = None, mem_reservation: str | int | None = None, @@ -329,9 +329,9 @@ class ContainerCollection(Collection[Container]): shm_size: str | int | None = None, stdin_open: bool = False, stop_signal: str | None = None, - storage_opt: dict[Incomplete, Incomplete] | None = None, + storage_opt: dict[str, str] | None = None, stream: bool = False, - sysctls: dict[Incomplete, Incomplete] | None = None, + sysctls: dict[str, str] | None = None, tmpfs: dict[str, str] | None = None, tty: bool = False, ulimits: list[Ulimit] | None = None, @@ -345,6 +345,7 @@ class ContainerCollection(Collection[Container]): volumes_from: list[str] | None = None, working_dir: str | None = None, ) -> Container: ... + @override def create( # type:ignore[override] self, image: str | Image, @@ -367,22 +368,22 @@ class ContainerCollection(Collection[Container]): cpuset_cpus: str | None = None, cpuset_mems: str | None = None, detach: bool = False, - device_cgroup_rules: list[Incomplete] | None = None, + device_cgroup_rules: list[str] | None = None, device_read_bps: list[Mapping[str, str | int]] | None = None, device_read_iops: list[Mapping[str, str | int]] | None = None, device_write_bps: list[Mapping[str, str | int]] | None = None, device_write_iops: list[Mapping[str, str | int]] | None = None, devices: list[str] | None = None, device_requests: list[DeviceRequest] | None = None, - dns: list[Incomplete] | None = None, - dns_opt: list[Incomplete] | None = None, - dns_search: list[Incomplete] | None = None, - domainname: str | list[Incomplete] | None = None, + dns: list[str] | None = None, + dns_opt: list[str] | None = None, + dns_search: list[str] | None = None, + domainname: str | list[str] | None = None, entrypoint: str | list[str] | None = None, environment: dict[str, str] | list[str] | None = None, extra_hosts: dict[str, str] | None = None, group_add: Iterable[str | int] | None = None, - healthcheck: dict[Incomplete, Incomplete] | None = None, + healthcheck: dict[str, Any] | None = None, hostname: str | None = None, init: bool | None = None, init_path: str | None = None, @@ -392,7 +393,7 @@ class ContainerCollection(Collection[Container]): labels: dict[str, str] | list[str] | None = None, links: dict[str, str] | dict[str, None] | dict[str, str | None] | Iterable[tuple[str, str | None]] | None = None, log_config: LogConfig | None = None, - lxc_conf: dict[Incomplete, Incomplete] | None = None, + lxc_conf: dict[str, str] | None = None, mac_address: str | None = None, mem_limit: str | int | None = None, mem_reservation: str | int | None = None, @@ -420,9 +421,9 @@ class ContainerCollection(Collection[Container]): shm_size: str | int | None = None, stdin_open: bool = False, stop_signal: str | None = None, - storage_opt: dict[Incomplete, Incomplete] | None = None, + storage_opt: dict[str, str] | None = None, stream: bool = False, - sysctls: dict[Incomplete, Incomplete] | None = None, + sysctls: dict[str, str] | None = None, tmpfs: dict[str, str] | None = None, tty: bool = False, ulimits: list[Ulimit] | None = None, @@ -436,22 +437,24 @@ class ContainerCollection(Collection[Container]): volumes_from: list[str] | None = None, working_dir: str | None = None, ) -> Container: ... + @override def get(self, container_id: str) -> Container: ... + @override def list( self, all: bool = False, before: str | None = None, - filters: dict[str, Incomplete] | None = None, + filters: dict[str, str | list[str] | bool] | None = None, limit: int = -1, since: str | None = None, sparse: bool = False, ignore_removed: bool = False, ) -> list[Container]: ... - def prune(self, filters: dict[str, Incomplete] | None = None) -> dict[str, Incomplete]: ... + def prune(self, filters: dict[str, str | list[str] | bool] | None = None) -> dict[str, Any]: ... RUN_CREATE_KWARGS: list[str] RUN_HOST_CONFIG_KWARGS: list[str] class ExecResult(NamedTuple): - exit_code: Incomplete - output: Incomplete + exit_code: int | None + output: bytes | Iterator[bytes] diff --git a/stubs/docker/docker/models/plugins.pyi b/stubs/docker/docker/models/plugins.pyi index 92b7da67e199..e54f31bc0e9a 100644 --- a/stubs/docker/docker/models/plugins.pyi +++ b/stubs/docker/docker/models/plugins.pyi @@ -1,25 +1,30 @@ -from _typeshed import Incomplete from collections.abc import Generator +from typing import Any + +from typing_extensions import override from .resource import Collection, Model class Plugin(Model): @property - def name(self): ... + def name(self) -> str | None: ... @property - def enabled(self): ... + def enabled(self) -> bool | None: ... @property - def settings(self): ... - def configure(self, options) -> None: ... + def settings(self) -> dict[str, Any] | None: ... + def configure(self, options: dict[str, Any]) -> None: ... def disable(self, force: bool = False) -> None: ... def enable(self, timeout: int = 0) -> None: ... - def push(self): ... - def remove(self, force: bool = False): ... - def upgrade(self, remote=None) -> Generator[Incomplete, Incomplete, None]: ... + def push(self) -> Generator[dict[str, Any], None, None]: ... + def remove(self, force: bool = False) -> bool: ... + def upgrade(self, remote: str | None = None) -> Generator[dict[str, Any], None, None]: ... class PluginCollection(Collection[Plugin]): model: type[Plugin] + @override def create(self, name, plugin_data_dir, gzip: bool = False): ... # type:ignore[override] + @override def get(self, name): ... def install(self, remote_name, local_name=None): ... + @override def list(self): ... diff --git a/stubs/docker/docker/transport/basehttpadapter.pyi b/stubs/docker/docker/transport/basehttpadapter.pyi index 1db332d94b83..a97fb2c422d7 100644 --- a/stubs/docker/docker/transport/basehttpadapter.pyi +++ b/stubs/docker/docker/transport/basehttpadapter.pyi @@ -1,4 +1,17 @@ +from collections.abc import Mapping + import requests.adapters +from typing_extensions import override +from urllib3 import ConnectionPool class BaseHTTPAdapter(requests.adapters.HTTPAdapter): + @override def close(self) -> None: ... + @override + def get_connection_with_tls_context( + self, + request: requests.PreparedRequest, + verify: bool | str | None, + proxies: Mapping[str, str] | None = None, + cert: tuple[str, str] | str | None = None, + ) -> ConnectionPool: ... From 285cdc2c563b742bbe809df5826f168f330c1d80 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 27 Mar 2026 14:58:32 +0000 Subject: [PATCH 2/3] [pre-commit.ci] auto fixes from pre-commit.com hooks --- stubs/docker/docker/models/containers.pyi | 1 - stubs/docker/docker/models/plugins.pyi | 1 - stubs/docker/docker/transport/basehttpadapter.pyi | 2 +- 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/stubs/docker/docker/models/containers.pyi b/stubs/docker/docker/models/containers.pyi index 4eaeba94c20c..09f7c3030c36 100644 --- a/stubs/docker/docker/models/containers.pyi +++ b/stubs/docker/docker/models/containers.pyi @@ -3,7 +3,6 @@ from _io import _BufferedReaderStream from collections.abc import Iterable, Iterator, Mapping from socket import SocketIO from typing import Any, Literal, NamedTuple, TypedDict, overload, type_check_only - from typing_extensions import NotRequired, override from docker._types import ContainerWeightDevice, WaitContainerResponse diff --git a/stubs/docker/docker/models/plugins.pyi b/stubs/docker/docker/models/plugins.pyi index e54f31bc0e9a..3c62a6805d9a 100644 --- a/stubs/docker/docker/models/plugins.pyi +++ b/stubs/docker/docker/models/plugins.pyi @@ -1,6 +1,5 @@ from collections.abc import Generator from typing import Any - from typing_extensions import override from .resource import Collection, Model diff --git a/stubs/docker/docker/transport/basehttpadapter.pyi b/stubs/docker/docker/transport/basehttpadapter.pyi index a97fb2c422d7..e54fbb345917 100644 --- a/stubs/docker/docker/transport/basehttpadapter.pyi +++ b/stubs/docker/docker/transport/basehttpadapter.pyi @@ -1,7 +1,7 @@ from collections.abc import Mapping +from typing_extensions import override import requests.adapters -from typing_extensions import override from urllib3 import ConnectionPool class BaseHTTPAdapter(requests.adapters.HTTPAdapter): From 207ef1e56ac503666c1ed47d57cc8e931e03d8d8 Mon Sep 17 00:00:00 2001 From: Emmanuel Ferdman Date: Fri, 27 Mar 2026 18:01:36 +0300 Subject: [PATCH 3/3] [docker] Fix incomplete types in models and add missing method Signed-off-by: Emmanuel Ferdman --- stubs/docker/docker/models/containers.pyi | 3 +-- stubs/docker/docker/transport/basehttpadapter.pyi | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/stubs/docker/docker/models/containers.pyi b/stubs/docker/docker/models/containers.pyi index 09f7c3030c36..6ccde4fb9c2a 100644 --- a/stubs/docker/docker/models/containers.pyi +++ b/stubs/docker/docker/models/containers.pyi @@ -438,7 +438,6 @@ class ContainerCollection(Collection[Container]): ) -> Container: ... @override def get(self, container_id: str) -> Container: ... - @override def list( self, all: bool = False, @@ -449,7 +448,7 @@ class ContainerCollection(Collection[Container]): sparse: bool = False, ignore_removed: bool = False, ) -> list[Container]: ... - def prune(self, filters: dict[str, str | list[str] | bool] | None = None) -> dict[str, Any]: ... + def prune(self, filters: dict[str, Any] | None = None) -> dict[str, Any]: ... RUN_CREATE_KWARGS: list[str] RUN_HOST_CONFIG_KWARGS: list[str] diff --git a/stubs/docker/docker/transport/basehttpadapter.pyi b/stubs/docker/docker/transport/basehttpadapter.pyi index e54fbb345917..b783be74b120 100644 --- a/stubs/docker/docker/transport/basehttpadapter.pyi +++ b/stubs/docker/docker/transport/basehttpadapter.pyi @@ -2,7 +2,7 @@ from collections.abc import Mapping from typing_extensions import override import requests.adapters -from urllib3 import ConnectionPool +from urllib3.connectionpool import ConnectionPool class BaseHTTPAdapter(requests.adapters.HTTPAdapter): @override