Skip to content

Commit fe96a34

Browse files
committed
Fix Python 3.11 compatibility
1 parent 5e79ed1 commit fe96a34

File tree

26 files changed

+92
-60
lines changed

26 files changed

+92
-60
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1010
> breaking changes may be introduced
1111
> at any time without warning.
1212
13+
## [Unreleased]
14+
15+
### Fixed
16+
17+
- Remove syntax that prevented compatibility with Python 3.10 and 3.11.
18+
- Added aliases to `typing` symbols as needed if using a Python version older than 3.12.
19+
- Added `typing_extensions` as a dependency if using a Python version older than 3.12.
20+
1321
## [0.1.6] - 2024-06-03
1422

1523
### Changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ classifiers = [
3232
]
3333
keywords = ["libretro", "retroarch", "emulation", "testing", "retrogaming"]
3434
dependencies = [
35-
"typing_extensions == 4.*; python_version == '3.10'",
35+
"typing_extensions == 4.*; python_version < '3.12'",
3636
]
3737

3838
[project.optional-dependencies]

src/libretro/_typing.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import sys
2+
3+
if sys.version_info >= (3, 12):
4+
from collections.abc import Buffer, override
5+
else:
6+
from typing_extensions import Buffer, override
7+
8+
__all__ = [
9+
"Buffer",
10+
"override",
11+
]

src/libretro/api/_utils.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import ctypes
22
import mmap
3-
from collections.abc import Buffer, Iterator
3+
from collections.abc import Iterator
44
from contextlib import contextmanager
55
from copy import deepcopy
66
from ctypes import (
@@ -27,6 +27,8 @@
2727
from os import PathLike
2828
from typing import TypeAlias, get_type_hints
2929

30+
from libretro._typing import Buffer
31+
3032
# When https://github.com/python/cpython/issues/112015 is merged,
3133
# use ctypes.memoryview_at instead of this hack
3234
# taken from https://stackoverflow.com/a/72968176/1089957
@@ -71,7 +73,7 @@ def is_zeroed(struct: Structure) -> bool:
7173
return not any(view)
7274

7375

74-
def from_zero_terminated[S](ptr) -> Iterator[S]:
76+
def from_zero_terminated(ptr) -> Iterator:
7577
if ptr:
7678
i = 0
7779
while not is_zeroed(ptr[i]):

src/libretro/api/content.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import os
2-
from collections.abc import Buffer, Generator, Iterator, Mapping, Sequence
2+
from collections.abc import Generator, Iterator, Mapping, Sequence
33
from contextlib import contextmanager
44
from ctypes import (
55
POINTER,
@@ -19,6 +19,7 @@
1919
from typing import Any, NamedTuple, TypeAlias, overload
2020
from zipfile import Path as ZipPath
2121

22+
from libretro._typing import Buffer
2223
from libretro.api._utils import (
2324
FieldsFromTypeHints,
2425
as_bytes,

src/libretro/builder.py

Lines changed: 38 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from enum import Enum, auto
44
from logging import Logger
55
from os import PathLike
6-
from typing import AnyStr, Literal, Self, TypedDict
6+
from typing import AnyStr, Literal, Self, TypeAlias, TypedDict, TypeVar
77
from zipfile import Path as ZipPath
88

99
from libretro.api import (
@@ -70,12 +70,6 @@
7070
except ImportError:
7171
ModernGlVideoDriver = None
7272

73-
type _RequiredFactory[T] = Callable[[], T]
74-
type _OptionalFactory[T] = Callable[[], T | None]
75-
76-
type _RequiredArg[T] = T | _RequiredFactory[T]
77-
type _OptionalArg[T] = T | _OptionalFactory[T] | Default | None
78-
7973

8074
class _DefaultType(Enum):
8175
DEFAULT = auto()
@@ -88,38 +82,50 @@ class _DefaultType(Enum):
8882
When passed to a SessionBuilder method, the method will use the default value for that argument.
8983
"""
9084

85+
T = TypeVar("T")
86+
87+
_RequiredFactory: TypeAlias = Callable[[], T]
88+
_OptionalFactory: TypeAlias = Callable[[], T | None]
89+
90+
_RequiredArg: TypeAlias = T | _RequiredFactory[T]
91+
_OptionalArg: TypeAlias = T | _OptionalFactory[T] | Default | None
92+
9193
_nothing = lambda: None
92-
CoreArg = Core | str | PathLike | CDLL | _RequiredFactory[Core]
93-
AudioDriverArg = _RequiredArg[AudioDriver] | Default
94-
InputDriverArg = (
94+
CoreArg: TypeAlias = Core | str | PathLike | CDLL | _RequiredFactory[Core]
95+
AudioDriverArg: TypeAlias = _RequiredArg[AudioDriver] | Default
96+
InputDriverArg: TypeAlias = (
9597
_RequiredArg[InputDriver]
9698
| InputStateGenerator
9799
| InputStateIterable
98100
| InputStateIterator
99101
| Default
100102
)
101-
VideoDriverArg = _RequiredArg[VideoDriver] | Default
102-
ContentArg = Content | SubsystemContent | _OptionalFactory[Content | SubsystemContent] | None
103-
ContentDriverArg = _OptionalArg[ContentDriver]
104-
BoolArg = _OptionalArg[bool]
105-
MessageDriverArg = _OptionalArg[MessageInterface] | Logger
106-
OptionDriverArg = _OptionalArg[OptionDriver] | Mapping[AnyStr, AnyStr] | Literal[0, 1, 2]
107-
PathDriverArg = _OptionalArg[PathDriver] | str | PathLike
108-
LogDriverArg = _OptionalArg[LogDriver] | Logger
109-
PerfDriverArg = _OptionalArg[PerfDriver]
110-
LocationDriverArg = _OptionalArg[LocationDriver] | LocationInputGenerator
111-
UserDriverArg = _OptionalArg[UserDriver]
112-
FileSystemArg = _OptionalArg[FileSystemInterface] | Literal[1, 2, 3]
113-
LedDriverArg = _OptionalArg[LedDriver]
114-
AvEnableFlagsArg = _OptionalArg[AvEnableFlags]
115-
MidiDriverArg = _OptionalArg[MidiDriver]
116-
TimingDriverArg = _OptionalArg[TimingDriver]
117-
FloatArg = _OptionalArg[float | int]
118-
HardwareContextArg = _OptionalArg[HardwareContext]
119-
ThrottleStateArg = _OptionalArg[retro_throttle_state]
120-
SavestateContextArg = _OptionalArg[SavestateContext]
121-
MicDriverArg = _OptionalArg[MicrophoneDriver]
122-
PowerDriverArg = _OptionalArg[PowerDriver] | retro_device_power
103+
VideoDriverArg: TypeAlias = _RequiredArg[VideoDriver] | Default
104+
ContentArg: TypeAlias = (
105+
Content | SubsystemContent | _OptionalFactory[Content | SubsystemContent] | None
106+
)
107+
ContentDriverArg: TypeAlias = _OptionalArg[ContentDriver]
108+
BoolArg: TypeAlias = _OptionalArg[bool]
109+
MessageDriverArg: TypeAlias = _OptionalArg[MessageInterface] | Logger
110+
OptionDriverArg: TypeAlias = (
111+
_OptionalArg[OptionDriver] | Mapping[AnyStr, AnyStr] | Literal[0, 1, 2]
112+
)
113+
PathDriverArg: TypeAlias = _OptionalArg[PathDriver] | str | PathLike
114+
LogDriverArg: TypeAlias = _OptionalArg[LogDriver] | Logger
115+
PerfDriverArg: TypeAlias = _OptionalArg[PerfDriver]
116+
LocationDriverArg: TypeAlias = _OptionalArg[LocationDriver] | LocationInputGenerator
117+
UserDriverArg: TypeAlias = _OptionalArg[UserDriver]
118+
FileSystemArg: TypeAlias = _OptionalArg[FileSystemInterface] | Literal[1, 2, 3]
119+
LedDriverArg: TypeAlias = _OptionalArg[LedDriver]
120+
AvEnableFlagsArg: TypeAlias = _OptionalArg[AvEnableFlags]
121+
MidiDriverArg: TypeAlias = _OptionalArg[MidiDriver]
122+
TimingDriverArg: TypeAlias = _OptionalArg[TimingDriver]
123+
FloatArg: TypeAlias = _OptionalArg[float | int]
124+
HardwareContextArg: TypeAlias = _OptionalArg[HardwareContext]
125+
ThrottleStateArg: TypeAlias = _OptionalArg[retro_throttle_state]
126+
SavestateContextArg: TypeAlias = _OptionalArg[SavestateContext]
127+
MicDriverArg: TypeAlias = _OptionalArg[MicrophoneDriver]
128+
PowerDriverArg: TypeAlias = _OptionalArg[PowerDriver] | retro_device_power
123129

124130

125131
class RequiredError(RuntimeError):

src/libretro/core.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from abc import abstractmethod
2-
from collections.abc import Buffer, Callable, Sequence
2+
from collections.abc import Callable, Sequence
33
from copy import deepcopy
44
from ctypes import (
55
CDLL,
@@ -19,6 +19,7 @@
1919
from os import PathLike
2020
from typing import Protocol
2121

22+
from libretro._typing import Buffer
2223
from libretro.api import (
2324
Region,
2425
retro_audio_sample_batch_t,

src/libretro/drivers/audio/array.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from array import array
22
from copy import deepcopy
3-
from typing import override
43

4+
from libretro._typing import override
55
from libretro.api.audio import retro_audio_buffer_status_callback, retro_audio_callback
66
from libretro.api.av import retro_system_av_info
77
from libretro.error import UnsupportedEnvCall

src/libretro/drivers/audio/wave.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
from copy import deepcopy
33
from io import RawIOBase
44
from os import PathLike, fsdecode
5-
from typing import override
65

6+
from libretro._typing import override
77
from libretro.api.audio import retro_audio_buffer_status_callback, retro_audio_callback
88
from libretro.api.av import retro_system_av_info
99
from libretro.error import UnsupportedEnvCall

src/libretro/drivers/camera/generator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import override
1+
from libretro._typing import override
22

33
from ... import (
44
CameraCapabilityFlags,

src/libretro/drivers/content/standard.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
from ctypes import Array, c_void_p
55
from os import PathLike
66
from tempfile import TemporaryDirectory
7-
from typing import override
87
from zipfile import Path as ZipPath
98

9+
from libretro._typing import override
1010
from libretro.api import (
1111
Content,
1212
ContentInfoOverrides,

src/libretro/drivers/environment/composite.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,11 @@
1616
sizeof,
1717
string_at,
1818
)
19-
from typing import AnyStr, Required, TypedDict, override
19+
from typing import AnyStr, Required, TypedDict
2020

2121
from _ctypes import CFuncPtr
2222

23+
from libretro._typing import override
2324
from libretro.api import (
2425
AvEnableFlags,
2526
HardwareContext,

src/libretro/drivers/environment/default.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from collections.abc import Mapping
22
from ctypes import POINTER, c_bool, c_char_p, c_float, c_uint, c_uint64, cast
3-
from typing import override
43

4+
from libretro._typing import override
55
from libretro.api import (
66
EnvironmentCall,
77
retro_audio_buffer_status_callback,

src/libretro/drivers/environment/dict.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from collections.abc import Callable, KeysView, Mapping
22
from ctypes import c_void_p
33
from types import MappingProxyType
4-
from typing import override
54

5+
from libretro._typing import override
66
from libretro.api import EnvironmentCall
77
from libretro.error import UnsupportedEnvCall
88

src/libretro/drivers/input/generator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from collections.abc import Callable, Generator, Iterable, Iterator, Sequence
22
from dataclasses import dataclass
33
from enum import Enum, auto
4-
from typing import override
54

5+
from libretro._typing import override
66
from libretro._utils import Pollable
77
from libretro.api.input import (
88
AnalogState,

src/libretro/drivers/led/dict.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import override
1+
from libretro._typing import override
22

33
from .driver import LedDriver
44

src/libretro/drivers/microphone/generator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from array import array
22
from collections.abc import Callable, Generator, Iterable, Iterator, Sequence
3-
from typing import override
43

4+
from libretro._typing import override
55
from libretro.api.microphone import INTERFACE_VERSION, retro_microphone_params
66

77
from .driver import Microphone, MicrophoneDriver

src/libretro/drivers/netpacket/socket.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from socket import AddressFamily, SocketKind, socket
2-
from typing import override
32

3+
from libretro._typing import override
44
from libretro.api.netpacket import NetpacketFlags, retro_netpacket_callback
55

66
from .driver import ClientID, NetpacketDriver

src/libretro/drivers/options/dict.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22
from collections.abc import Mapping, MutableMapping, Sequence
33
from copy import deepcopy
44
from ctypes import Array, string_at
5-
from typing import AnyStr, override
5+
from typing import AnyStr
66

7+
from libretro._typing import override
78
from libretro.api._utils import as_bytes, from_zero_terminated
89
from libretro.api.options import (
910
CoreOptionArray,

src/libretro/drivers/path/default.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from os import PathLike, fsencode
2-
from typing import override
2+
3+
from libretro._typing import override
34

45
from .driver import PathDriver
56

src/libretro/drivers/power/driver.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from abc import abstractmethod
2-
from typing import Protocol, override, runtime_checkable
2+
from typing import Protocol, runtime_checkable
33

4+
from libretro._typing import override
45
from libretro.api.power import retro_device_power
56

67

src/libretro/drivers/timing/default.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
from copy import deepcopy
2-
from typing import override
3-
1+
from libretro._typing import override
42
from libretro.api.timing import (
53
retro_fastforwarding_override,
64
retro_frame_time_callback,

src/libretro/drivers/user/default.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
from typing import override
2-
1+
from libretro._typing import override
32
from libretro.api.user import Language
43

54
from .driver import UserDriver

src/libretro/drivers/video/multi.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
from collections.abc import Callable, Mapping, Set
22
from copy import deepcopy
3-
from typing import final, override
3+
from typing import final
44

5+
from libretro._typing import override
56
from libretro.api.av import retro_game_geometry, retro_system_av_info
67
from libretro.api.proc import retro_proc_address_t
78
from libretro.api.video import (

src/libretro/drivers/video/software/array.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import itertools
22
from array import array
33
from copy import deepcopy
4-
from typing import final, override
4+
from typing import final
55
from warnings import warn
66

7+
from libretro._typing import override
78
from libretro.api.av import retro_game_geometry, retro_system_av_info
89
from libretro.api.video import MemoryAccess, PixelFormat, Rotation, retro_framebuffer
910

src/libretro/drivers/video/software/base.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from abc import ABC
22
from collections.abc import Set
3-
from typing import final, override
3+
from typing import final
44

5-
from libretro.api.proc import retro_proc_address_t
5+
from libretro._typing import override
66
from libretro.api.video.context import HardwareContext, retro_hw_render_callback
77
from libretro.api.video.render import retro_hw_render_interface
88
from libretro.error import UnsupportedEnvCall

0 commit comments

Comments
 (0)