Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add basic pygame.typing unit test, remove problematic TypeAlias usage #3150

Merged
merged 2 commits into from
Oct 12, 2024
Merged
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
16 changes: 8 additions & 8 deletions buildconfig/stubs/pygame/typing.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ __all__ = [

import sys
from abc import abstractmethod
from typing import IO, Callable, Tuple, Union, TypeVar, Protocol, TypeAlias
from typing import IO, Callable, Tuple, Union, TypeVar, Protocol

if sys.version_info >= (3, 9):
from os import PathLike as _PathProtocol
Expand All @@ -27,9 +27,9 @@ else:


# For functions that take a file name
_PathLike: TypeAlias = Union[str, bytes, _PathProtocol[str], _PathProtocol[bytes]]
_PathLike = Union[str, bytes, _PathProtocol[str], _PathProtocol[bytes]]
# Most pygame functions that take a file argument should be able to handle a FileLike type
FileLike: TypeAlias = Union[_PathLike, IO[bytes], IO[str]]
FileLike = Union[_PathLike, IO[bytes], IO[str]]

_T_co = TypeVar("_T_co", covariant=True)

Expand All @@ -49,11 +49,11 @@ class SequenceLike(Protocol[_T_co]):

# Pygame handles float without errors in most cases where a point is expected,
# usually rounding to int. Also, 'Union[int, float] == float'
Point: TypeAlias = SequenceLike[float]
Point = SequenceLike[float]
# This is used where ints are strictly required
IntPoint: TypeAlias = SequenceLike[int]
IntPoint = SequenceLike[int]

ColorLike: TypeAlias = Union[int, str, SequenceLike[int]]
ColorLike = Union[int, str, SequenceLike[int]]


class _HasRectAttribute(Protocol):
Expand All @@ -63,8 +63,8 @@ class _HasRectAttribute(Protocol):
def rect(self) -> Union["RectLike", Callable[[], "RectLike"]]: ...


RectLike: TypeAlias = Union[SequenceLike[float], SequenceLike[Point], _HasRectAttribute]
RectLike = Union[SequenceLike[float], SequenceLike[Point], _HasRectAttribute]


# cleanup namespace
del sys, abstractmethod, IO, Callable, Tuple, Union, TypeVar, Protocol, TypeAlias
del sys, abstractmethod, IO, Callable, Tuple, Union, TypeVar, Protocol
16 changes: 8 additions & 8 deletions src_py/typing.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

import sys
from abc import abstractmethod
from typing import IO, Callable, Tuple, Union, TypeVar, Protocol, TypeAlias
from typing import IO, Callable, Tuple, Union, TypeVar, Protocol

if sys.version_info >= (3, 9):
from os import PathLike as _PathProtocol
Expand All @@ -27,9 +27,9 @@ def __fspath__(self) -> _AnyStr_co: ...


# For functions that take a file name
_PathLike: TypeAlias = Union[str, bytes, _PathProtocol[str], _PathProtocol[bytes]]
_PathLike = Union[str, bytes, _PathProtocol[str], _PathProtocol[bytes]]
# Most pygame functions that take a file argument should be able to handle a FileLike type
FileLike: TypeAlias = Union[_PathLike, IO[bytes], IO[str]]
FileLike = Union[_PathLike, IO[bytes], IO[str]]

_T_co = TypeVar("_T_co", covariant=True)

Expand All @@ -49,11 +49,11 @@ def __len__(self) -> int: ...

# Pygame handles float without errors in most cases where a point is expected,
# usually rounding to int. Also, 'Union[int, float] == float'
Point: TypeAlias = SequenceLike[float]
Point = SequenceLike[float]
# This is used where ints are strictly required
IntPoint: TypeAlias = SequenceLike[int]
IntPoint = SequenceLike[int]

ColorLike: TypeAlias = Union[int, str, SequenceLike[int]]
ColorLike = Union[int, str, SequenceLike[int]]


class _HasRectAttribute(Protocol):
Expand All @@ -63,8 +63,8 @@ class _HasRectAttribute(Protocol):
def rect(self) -> Union["RectLike", Callable[[], "RectLike"]]: ...


RectLike: TypeAlias = Union[SequenceLike[float], SequenceLike[Point], _HasRectAttribute]
RectLike = Union[SequenceLike[float], SequenceLike[Point], _HasRectAttribute]


# cleanup namespace
del sys, abstractmethod, IO, Callable, Tuple, Union, TypeVar, Protocol, TypeAlias
del sys, abstractmethod, IO, Callable, Tuple, Union, TypeVar, Protocol
1 change: 1 addition & 0 deletions test/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ test_files = files(
'time_test.py',
'touch_test.py',
'transform_test.py',
'typing_test.py',
'version_test.py',
'video_test.py',
'window_test.py',
Expand Down
26 changes: 26 additions & 0 deletions test/typing_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import unittest

# A basic unit test to test that pygame.typing can import in python code, and
# the documented attributes are accessible.
# More rigorous testing needs mypy and is therefore implemented in the stubs
# directory.
TYPING_PUBLIC_ATTRS = [
"RectLike",
"SequenceLike",
"FileLike",
"ColorLike",
"Point",
"IntPoint",
]


class TypingTest(unittest.TestCase):
def test_typing_has_attrs(self):
import pygame.typing

for i in TYPING_PUBLIC_ATTRS:
self.assertTrue(hasattr(pygame.typing, i))


if __name__ == "__main__":
unittest.main()
Loading