File size: 2,071 Bytes
3f7c971
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
from __future__ import annotations

import warnings

from . import __version__


def deprecate(

    deprecated: str,

    when: int | None,

    replacement: str | None = None,

    *,

    action: str | None = None,

    plural: bool = False,

) -> None:
    """

    Deprecations helper.



    :param deprecated: Name of thing to be deprecated.

    :param when: Pillow major version to be removed in.

    :param replacement: Name of replacement.

    :param action: Instead of "replacement", give a custom call to action

        e.g. "Upgrade to new thing".

    :param plural: if the deprecated thing is plural, needing "are" instead of "is".



    Usually of the form:



        "[deprecated] is deprecated and will be removed in Pillow [when] (yyyy-mm-dd).

        Use [replacement] instead."



    You can leave out the replacement sentence:



        "[deprecated] is deprecated and will be removed in Pillow [when] (yyyy-mm-dd)"



    Or with another call to action:



        "[deprecated] is deprecated and will be removed in Pillow [when] (yyyy-mm-dd).

        [action]."

    """

    is_ = "are" if plural else "is"

    if when is None:
        removed = "a future version"
    elif when <= int(__version__.split(".")[0]):
        msg = f"{deprecated} {is_} deprecated and should be removed."
        raise RuntimeError(msg)
    elif when == 11:
        removed = "Pillow 11 (2024-10-15)"
    elif when == 12:
        removed = "Pillow 12 (2025-10-15)"
    else:
        msg = f"Unknown removal version: {when}. Update {__name__}?"
        raise ValueError(msg)

    if replacement and action:
        msg = "Use only one of 'replacement' and 'action'"
        raise ValueError(msg)

    if replacement:
        action = f". Use {replacement} instead."
    elif action:
        action = f". {action.rstrip('.')}."
    else:
        action = ""

    warnings.warn(
        f"{deprecated} {is_} deprecated and will be removed in {removed}{action}",
        DeprecationWarning,
        stacklevel=3,
    )