Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions stubs/colour/@tests/stubtest_allowlist.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
colour.Color.set_hex_l
2 changes: 2 additions & 0 deletions stubs/colour/METADATA.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
version = "0.1.5"
upstream-repository = "https://github.com/vaab/colour"
102 changes: 102 additions & 0 deletions stubs/colour/colour.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
import re
from collections.abc import Callable, Generator, Hashable
from types import NotImplementedType
from typing import Any, Final, final, overload
from typing_extensions import Self

FLOAT_ERROR: Final[float] = 0.0000005

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
FLOAT_ERROR: Final[float] = 0.0000005
FLOAT_ERROR: Final = 0.0000005


RGB_TO_COLOR_NAMES: Final[dict[tuple[int, int, int], list[str]]]

COLOR_NAME_TO_RGB: Final[dict[list[str], tuple[int, int, int]]]

LONG_HEX_COLOR: Final[re.Pattern[str]]
SHORT_HEX_COLOR: Final[re.Pattern[str]]

@final
class C_HSL:
def __getattr__(self, value: str) -> tuple[float, float, float]: ...

@final
class C_RGB:
def __getattr__(self, value: str) -> tuple[float, float, float]: ...

@final
class C_HEX:
def __getattr__(self, value: str) -> str: ...

HSL: Final[C_HSL]
RGB: Final[C_RGB]
HEX: Final[C_HEX]

def hsl2rgb(hsl: tuple[float, float, float]) -> tuple[float, float, float]: ...
def rgb2hsl(rgb: tuple[float, float, float]) -> tuple[float, float, float]: ...
def _hue2rgb(v1: float, v2: float, vH: float) -> float: ...
def rgb2hex(rgb: tuple[float, float, float], force_long: bool = False) -> str: ...
def hex2rgb(str_rgb: str) -> tuple[float, float, float]: ...
def hex2web(hex: str) -> str: ...
def web2hex(web: str, force_long: bool = False) -> str: ...

hsl2hex: Final[Callable[[tuple[float, float, float]], str]]
hex2hsl: Final[Callable[[str], tuple[float, float, float]]]
rgb2web: Final[Callable[[tuple[float, float, float]], str]]
web2rgb: Final[Callable[[str], tuple[float, float, float]]]
web2hsl: Final[Callable[[str], tuple[float, float, float]]]
hsl2web: Final[Callable[[tuple[float, float, float]], str]]

def color_scale(
begin_hsl: tuple[float, float, float], end_hsl: tuple[float, float, float], nb: int
) -> tuple[float, float, float]: ...
def RGB_color_picker(obj: Any) -> Color: ...

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As this will work with literally every object:

Suggested change
def RGB_color_picker(obj: Any) -> Color: ...
def RGB_color_picker(obj: object) -> Color: ...


@overload
def hash_or_str(obj: Hashable) -> int: ...
@overload
def hash_or_str(obj: object) -> str: ... # type: ignore[overload-cannot-match]

class Color:
def __init__(
self,
color: Self | str | None = None,
pick_for: object | None = None,
picker: Callable[[object], Color] = ...,
pick_key: Callable[[object], int | str] = ...,
**kwargs: Any,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since we need documentation for non-obvious uses of Any:

Suggested change
**kwargs: Any,
**kwargs: Any, # additional arguments become attributes

) -> None: ...
def __getattr__(self, label: str) -> Any: ...

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is probably better expressed by just copying the get_* methods below as properties.

def __setattr__(self, label: str, value: Any) -> None: ...

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here (but as attribute setters, except for equality).

def get_hsl(self) -> tuple[float, float, float]: ...
def get_hex(self) -> str: ...
def get_hex_l(self) -> str: ...
def get_rgb(self) -> tuple[float, float, float]: ...
def get_hue(self) -> float: ...
def get_saturation(self) -> float: ...
def get_luminance(self) -> float: ...
def get_red(self) -> float: ...
def get_green(self) -> float: ...
def get_blue(self) -> float: ...
def get_web(self) -> str: ...
def set_hsl(self, value: float) -> None: ...
def set_rgb(self, value: float) -> None: ...
def set_hue(self, value: float) -> None: ...
def set_saturation(self, value: float) -> None: ...
def set_luminance(self, value: float) -> None: ...
def set_red(self, value: float) -> None: ...
def set_green(self, value: float) -> None: ...
def set_blue(self, value: float) -> None: ...
def set_hex(self, value: str) -> None: ...

set_hex_l: Final[Callable[[str], None]] = ...

def set_web(self, value: str) -> None: ...
def range_to(self, value: str | Color | None, steps: int) -> Generator[Color]: ...
def __eq__(self, other: object) -> bool | NotImplementedType: ... # type: ignore[override]

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The NotImplementedType doesn't need to be annotated:

Suggested change
def __eq__(self, other: object) -> bool | NotImplementedType: ... # type: ignore[override]
def __eq__(self, other: object) -> bool: ... # type: ignore[override]


RGB_equivalence: Final[Callable[[Color, Color], bool]]
HSL_equivalence: Final[Callable[[Color, Color], bool]]

def make_color_factory(
**kwargs_defaults: Any,
) -> Callable[
[Color | str | None, object | None, Callable[[object], Color], object | None, Callable[[object], int | str]], Color
]: ...

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This could be expressed using a callable protocol:

Suggested change
]: ...
@type_check_only
class _ColorFactory(Protocol):
def __call__(
self,
color: Self | str | None = None,
pick_for: object | None = None,
picker: Callable[[object], Color] = ...,
pick_key: Callable[[object], int | str] = ...,
**kwargs: Any # additional arguments become attributes on Color
) -> Color: ...
def make_color_factory(
*,
color: Self | str | None = None,
pick_for: object | None = None,
picker: Callable[[object], Color] = ...,
pick_key: Callable[[object], int | str] = ...,
**kwargs: Any # additional arguments become attributes on Color
) -> _ColorFactory: ...