Skip to content

Commit

Permalink
Merge pull request #3150 from pygame-community/ankith26-typing-test
Browse files Browse the repository at this point in the history
Add basic pygame.typing unit test, remove problematic TypeAlias usage
  • Loading branch information
ankith26 authored Oct 12, 2024
2 parents 3ce1d23 + 8414fed commit dd3df52
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 16 deletions.
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()

0 comments on commit dd3df52

Please sign in to comment.