from collections.abc import Callable
import contextlib
from typing import Any, TypedDict, TypeVar, overload
from typing_extensions import (
    ParamSpec,  # < Py 3.10
    Unpack,  # < Py 3.11
)

_P = ParamSpec("_P")
_R = TypeVar("_R")
_T = TypeVar("_T")

class MatplotlibDeprecationWarning(DeprecationWarning): ...

class DeprecationKwargs(TypedDict, total=False):
    message: str
    alternative: str
    pending: bool
    obj_type: str
    addendum: str
    removal: str

class NamedDeprecationKwargs(DeprecationKwargs, total=False):
    name: str

def warn_deprecated(since: str, **kwargs: Unpack[NamedDeprecationKwargs]) -> None: ...
def deprecated(
    since: str, **kwargs: Unpack[NamedDeprecationKwargs]
) -> Callable[[_T], _T]: ...

class deprecate_privatize_attribute(Any):
    def __init__(self, since: str, **kwargs: Unpack[NamedDeprecationKwargs]): ...
    def __set_name__(self, owner: type[object], name: str) -> None: ...

DECORATORS: dict[Callable, Callable] = ...

@overload
def rename_parameter(
    since: str, old: str, new: str, func: None = ...
) -> Callable[[Callable[_P, _R]], Callable[_P, _R]]: ...
@overload
def rename_parameter(
    since: str, old: str, new: str, func: Callable[_P, _R]
) -> Callable[_P, _R]: ...

class _deprecated_parameter_class: ...

_deprecated_parameter: _deprecated_parameter_class

@overload
def delete_parameter(
    since: str, name: str, func: None = ..., **kwargs: Unpack[DeprecationKwargs]
) -> Callable[[Callable[_P, _R]], Callable[_P, _R]]: ...
@overload
def delete_parameter(
    since: str, name: str, func: Callable[_P, _R], **kwargs: Unpack[DeprecationKwargs]
) -> Callable[_P, _R]: ...
@overload
def make_keyword_only(
    since: str, name: str, func: None = ...
) -> Callable[[Callable[_P, _R]], Callable[_P, _R]]: ...
@overload
def make_keyword_only(
    since: str, name: str, func: Callable[_P, _R]
) -> Callable[_P, _R]: ...
def deprecate_method_override(
    method: Callable[_P, _R],
    obj: object | type,
    *,
    allow_empty: bool = ...,
    since: str,
    **kwargs: Unpack[NamedDeprecationKwargs]
) -> Callable[_P, _R]: ...
def suppress_matplotlib_deprecation_warning() -> (
    contextlib.AbstractContextManager[None]
): ...
