From 3ee576fb844ae3ea9764baed7876167ab8c380b0 Mon Sep 17 00:00:00 2001 From: Joey Marianer Date: Tue, 1 Jul 2025 16:43:21 -0700 Subject: [PATCH 1/4] Lupa stubs: Support get/set/del from Lua tables. Lua table values are all Any because we can't typecheck across language boundaries. Support unpack_returned_tuples in the LuaRuntime constructor. # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Date: Tue Jul 1 16:43:21 2025 -0700 # # On branch main # Your branch is ahead of 'origin/main' by 1 commit. # (use "git push" to publish your local commits) # # Changes to be committed: # modified: lua51.pyi # modified: lua52.pyi # modified: lua53.pyi # modified: lua54.pyi # --- stubs/lupa/lupa/lua51.pyi | 9 ++++++--- stubs/lupa/lupa/lua52.pyi | 9 ++++++--- stubs/lupa/lupa/lua53.pyi | 9 ++++++--- stubs/lupa/lupa/lua54.pyi | 9 ++++++--- 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/stubs/lupa/lupa/lua51.pyi b/stubs/lupa/lupa/lua51.pyi index cdd4e4b096dd..0d579751d4a8 100644 --- a/stubs/lupa/lupa/lua51.pyi +++ b/stubs/lupa/lupa/lua51.pyi @@ -36,13 +36,16 @@ unpacks_lua_table_method: Callable[[Callable[..., Any]], Callable[..., Any]] @type_check_only class _LuaIter: - def __iter__(self) -> Iterator[object]: ... + def __iter__(self) -> Iterator[Any]: ... @type_check_only class _LuaTable: def keys(self) -> _LuaIter: ... def values(self) -> _LuaIter: ... def items(self) -> _LuaIter: ... + def __getitem__(self, key: str) -> Any: ... + def __setitem__(self, key: str, value: Any) -> None: ... + def __delitem__(self, key: str) -> None: ... @type_check_only class _LuaNoGC: ... @@ -70,8 +73,8 @@ class LuaRuntime: lua_implementation: Final[str] lua_version: Final[tuple[int, int]] - # @classmethod - # def __cinit__(cls, unpack_return_tuples: bool) -> None: ... + @classmethod + def __init__(cls, unpack_returned_tuples: bool) -> None: ... # def add_pending_unref(self, ref: int) -> None: ... # def clean_up_pending_unrefs(self) -> int: ... def get_max_memory(self, total: bool = False) -> int | MaybeNone: ... diff --git a/stubs/lupa/lupa/lua52.pyi b/stubs/lupa/lupa/lua52.pyi index cdd4e4b096dd..0d579751d4a8 100644 --- a/stubs/lupa/lupa/lua52.pyi +++ b/stubs/lupa/lupa/lua52.pyi @@ -36,13 +36,16 @@ unpacks_lua_table_method: Callable[[Callable[..., Any]], Callable[..., Any]] @type_check_only class _LuaIter: - def __iter__(self) -> Iterator[object]: ... + def __iter__(self) -> Iterator[Any]: ... @type_check_only class _LuaTable: def keys(self) -> _LuaIter: ... def values(self) -> _LuaIter: ... def items(self) -> _LuaIter: ... + def __getitem__(self, key: str) -> Any: ... + def __setitem__(self, key: str, value: Any) -> None: ... + def __delitem__(self, key: str) -> None: ... @type_check_only class _LuaNoGC: ... @@ -70,8 +73,8 @@ class LuaRuntime: lua_implementation: Final[str] lua_version: Final[tuple[int, int]] - # @classmethod - # def __cinit__(cls, unpack_return_tuples: bool) -> None: ... + @classmethod + def __init__(cls, unpack_returned_tuples: bool) -> None: ... # def add_pending_unref(self, ref: int) -> None: ... # def clean_up_pending_unrefs(self) -> int: ... def get_max_memory(self, total: bool = False) -> int | MaybeNone: ... diff --git a/stubs/lupa/lupa/lua53.pyi b/stubs/lupa/lupa/lua53.pyi index cdd4e4b096dd..0d579751d4a8 100644 --- a/stubs/lupa/lupa/lua53.pyi +++ b/stubs/lupa/lupa/lua53.pyi @@ -36,13 +36,16 @@ unpacks_lua_table_method: Callable[[Callable[..., Any]], Callable[..., Any]] @type_check_only class _LuaIter: - def __iter__(self) -> Iterator[object]: ... + def __iter__(self) -> Iterator[Any]: ... @type_check_only class _LuaTable: def keys(self) -> _LuaIter: ... def values(self) -> _LuaIter: ... def items(self) -> _LuaIter: ... + def __getitem__(self, key: str) -> Any: ... + def __setitem__(self, key: str, value: Any) -> None: ... + def __delitem__(self, key: str) -> None: ... @type_check_only class _LuaNoGC: ... @@ -70,8 +73,8 @@ class LuaRuntime: lua_implementation: Final[str] lua_version: Final[tuple[int, int]] - # @classmethod - # def __cinit__(cls, unpack_return_tuples: bool) -> None: ... + @classmethod + def __init__(cls, unpack_returned_tuples: bool) -> None: ... # def add_pending_unref(self, ref: int) -> None: ... # def clean_up_pending_unrefs(self) -> int: ... def get_max_memory(self, total: bool = False) -> int | MaybeNone: ... diff --git a/stubs/lupa/lupa/lua54.pyi b/stubs/lupa/lupa/lua54.pyi index cdd4e4b096dd..0d579751d4a8 100644 --- a/stubs/lupa/lupa/lua54.pyi +++ b/stubs/lupa/lupa/lua54.pyi @@ -36,13 +36,16 @@ unpacks_lua_table_method: Callable[[Callable[..., Any]], Callable[..., Any]] @type_check_only class _LuaIter: - def __iter__(self) -> Iterator[object]: ... + def __iter__(self) -> Iterator[Any]: ... @type_check_only class _LuaTable: def keys(self) -> _LuaIter: ... def values(self) -> _LuaIter: ... def items(self) -> _LuaIter: ... + def __getitem__(self, key: str) -> Any: ... + def __setitem__(self, key: str, value: Any) -> None: ... + def __delitem__(self, key: str) -> None: ... @type_check_only class _LuaNoGC: ... @@ -70,8 +73,8 @@ class LuaRuntime: lua_implementation: Final[str] lua_version: Final[tuple[int, int]] - # @classmethod - # def __cinit__(cls, unpack_return_tuples: bool) -> None: ... + @classmethod + def __init__(cls, unpack_returned_tuples: bool) -> None: ... # def add_pending_unref(self, ref: int) -> None: ... # def clean_up_pending_unrefs(self) -> int: ... def get_max_memory(self, total: bool = False) -> int | MaybeNone: ... From 98fac21ef71902906892af590af1fb50579e5a89 Mon Sep 17 00:00:00 2001 From: Joey Marianer Date: Tue, 1 Jul 2025 19:45:21 -0700 Subject: [PATCH 2/4] oof --- stubs/lupa/lupa/lua51.pyi | 25 ++++++++++---------- stubs/lupa/lupa/lua52.pyi | 25 ++++++++++---------- stubs/lupa/lupa/lua53.pyi | 25 ++++++++++---------- stubs/lupa/lupa/lua54.pyi | 25 ++++++++++---------- stubs/networkx/@tests/stubtest_allowlist.txt | 2 ++ 5 files changed, 50 insertions(+), 52 deletions(-) diff --git a/stubs/lupa/lupa/lua51.pyi b/stubs/lupa/lupa/lua51.pyi index 0d579751d4a8..6b9a0cd55aa6 100644 --- a/stubs/lupa/lupa/lua51.pyi +++ b/stubs/lupa/lupa/lua51.pyi @@ -1,6 +1,7 @@ from _typeshed import MaybeNone -from collections.abc import Callable, Iterator +from collections.abc import Callable, Iterable from typing import Any, Final, Generic, TypeVar, type_check_only +from typing_extensions import TypeAlias __all__ = [ "LUA_VERSION", @@ -34,18 +35,17 @@ unpacks_lua_table_method: Callable[[Callable[..., Any]], Callable[..., Any]] # inner classes -@type_check_only -class _LuaIter: - def __iter__(self) -> Iterator[Any]: ... - @type_check_only class _LuaTable: - def keys(self) -> _LuaIter: ... - def values(self) -> _LuaIter: ... - def items(self) -> _LuaIter: ... - def __getitem__(self, key: str) -> Any: ... - def __setitem__(self, key: str, value: Any) -> None: ... - def __delitem__(self, key: str) -> None: ... + def keys(self) -> Iterable[LuaKey]: ... + def values(self) -> Iterable[LuaObject]: ... + def items(self) -> Iterable[tuple[LuaKey, LuaObject]]: ... + def __getitem__(self, key: LuaKey) -> LuaObject: ... + def __setitem__(self, key: LuaKey, value: LuaObject) -> None: ... + def __delitem__(self, key: LuaKey) -> None: ... + +LuaKey: TypeAlias = str | int +LuaObject: TypeAlias = _LuaTable | int | str | float | bool | None @type_check_only class _LuaNoGC: ... @@ -73,8 +73,7 @@ class LuaRuntime: lua_implementation: Final[str] lua_version: Final[tuple[int, int]] - @classmethod - def __init__(cls, unpack_returned_tuples: bool) -> None: ... + def __init__(self, /, unpack_returned_tuples: bool, *args: Any) -> None: ... # def add_pending_unref(self, ref: int) -> None: ... # def clean_up_pending_unrefs(self) -> int: ... def get_max_memory(self, total: bool = False) -> int | MaybeNone: ... diff --git a/stubs/lupa/lupa/lua52.pyi b/stubs/lupa/lupa/lua52.pyi index 0d579751d4a8..6b9a0cd55aa6 100644 --- a/stubs/lupa/lupa/lua52.pyi +++ b/stubs/lupa/lupa/lua52.pyi @@ -1,6 +1,7 @@ from _typeshed import MaybeNone -from collections.abc import Callable, Iterator +from collections.abc import Callable, Iterable from typing import Any, Final, Generic, TypeVar, type_check_only +from typing_extensions import TypeAlias __all__ = [ "LUA_VERSION", @@ -34,18 +35,17 @@ unpacks_lua_table_method: Callable[[Callable[..., Any]], Callable[..., Any]] # inner classes -@type_check_only -class _LuaIter: - def __iter__(self) -> Iterator[Any]: ... - @type_check_only class _LuaTable: - def keys(self) -> _LuaIter: ... - def values(self) -> _LuaIter: ... - def items(self) -> _LuaIter: ... - def __getitem__(self, key: str) -> Any: ... - def __setitem__(self, key: str, value: Any) -> None: ... - def __delitem__(self, key: str) -> None: ... + def keys(self) -> Iterable[LuaKey]: ... + def values(self) -> Iterable[LuaObject]: ... + def items(self) -> Iterable[tuple[LuaKey, LuaObject]]: ... + def __getitem__(self, key: LuaKey) -> LuaObject: ... + def __setitem__(self, key: LuaKey, value: LuaObject) -> None: ... + def __delitem__(self, key: LuaKey) -> None: ... + +LuaKey: TypeAlias = str | int +LuaObject: TypeAlias = _LuaTable | int | str | float | bool | None @type_check_only class _LuaNoGC: ... @@ -73,8 +73,7 @@ class LuaRuntime: lua_implementation: Final[str] lua_version: Final[tuple[int, int]] - @classmethod - def __init__(cls, unpack_returned_tuples: bool) -> None: ... + def __init__(self, /, unpack_returned_tuples: bool, *args: Any) -> None: ... # def add_pending_unref(self, ref: int) -> None: ... # def clean_up_pending_unrefs(self) -> int: ... def get_max_memory(self, total: bool = False) -> int | MaybeNone: ... diff --git a/stubs/lupa/lupa/lua53.pyi b/stubs/lupa/lupa/lua53.pyi index 0d579751d4a8..6b9a0cd55aa6 100644 --- a/stubs/lupa/lupa/lua53.pyi +++ b/stubs/lupa/lupa/lua53.pyi @@ -1,6 +1,7 @@ from _typeshed import MaybeNone -from collections.abc import Callable, Iterator +from collections.abc import Callable, Iterable from typing import Any, Final, Generic, TypeVar, type_check_only +from typing_extensions import TypeAlias __all__ = [ "LUA_VERSION", @@ -34,18 +35,17 @@ unpacks_lua_table_method: Callable[[Callable[..., Any]], Callable[..., Any]] # inner classes -@type_check_only -class _LuaIter: - def __iter__(self) -> Iterator[Any]: ... - @type_check_only class _LuaTable: - def keys(self) -> _LuaIter: ... - def values(self) -> _LuaIter: ... - def items(self) -> _LuaIter: ... - def __getitem__(self, key: str) -> Any: ... - def __setitem__(self, key: str, value: Any) -> None: ... - def __delitem__(self, key: str) -> None: ... + def keys(self) -> Iterable[LuaKey]: ... + def values(self) -> Iterable[LuaObject]: ... + def items(self) -> Iterable[tuple[LuaKey, LuaObject]]: ... + def __getitem__(self, key: LuaKey) -> LuaObject: ... + def __setitem__(self, key: LuaKey, value: LuaObject) -> None: ... + def __delitem__(self, key: LuaKey) -> None: ... + +LuaKey: TypeAlias = str | int +LuaObject: TypeAlias = _LuaTable | int | str | float | bool | None @type_check_only class _LuaNoGC: ... @@ -73,8 +73,7 @@ class LuaRuntime: lua_implementation: Final[str] lua_version: Final[tuple[int, int]] - @classmethod - def __init__(cls, unpack_returned_tuples: bool) -> None: ... + def __init__(self, /, unpack_returned_tuples: bool, *args: Any) -> None: ... # def add_pending_unref(self, ref: int) -> None: ... # def clean_up_pending_unrefs(self) -> int: ... def get_max_memory(self, total: bool = False) -> int | MaybeNone: ... diff --git a/stubs/lupa/lupa/lua54.pyi b/stubs/lupa/lupa/lua54.pyi index 0d579751d4a8..6b9a0cd55aa6 100644 --- a/stubs/lupa/lupa/lua54.pyi +++ b/stubs/lupa/lupa/lua54.pyi @@ -1,6 +1,7 @@ from _typeshed import MaybeNone -from collections.abc import Callable, Iterator +from collections.abc import Callable, Iterable from typing import Any, Final, Generic, TypeVar, type_check_only +from typing_extensions import TypeAlias __all__ = [ "LUA_VERSION", @@ -34,18 +35,17 @@ unpacks_lua_table_method: Callable[[Callable[..., Any]], Callable[..., Any]] # inner classes -@type_check_only -class _LuaIter: - def __iter__(self) -> Iterator[Any]: ... - @type_check_only class _LuaTable: - def keys(self) -> _LuaIter: ... - def values(self) -> _LuaIter: ... - def items(self) -> _LuaIter: ... - def __getitem__(self, key: str) -> Any: ... - def __setitem__(self, key: str, value: Any) -> None: ... - def __delitem__(self, key: str) -> None: ... + def keys(self) -> Iterable[LuaKey]: ... + def values(self) -> Iterable[LuaObject]: ... + def items(self) -> Iterable[tuple[LuaKey, LuaObject]]: ... + def __getitem__(self, key: LuaKey) -> LuaObject: ... + def __setitem__(self, key: LuaKey, value: LuaObject) -> None: ... + def __delitem__(self, key: LuaKey) -> None: ... + +LuaKey: TypeAlias = str | int +LuaObject: TypeAlias = _LuaTable | int | str | float | bool | None @type_check_only class _LuaNoGC: ... @@ -73,8 +73,7 @@ class LuaRuntime: lua_implementation: Final[str] lua_version: Final[tuple[int, int]] - @classmethod - def __init__(cls, unpack_returned_tuples: bool) -> None: ... + def __init__(self, /, unpack_returned_tuples: bool, *args: Any) -> None: ... # def add_pending_unref(self, ref: int) -> None: ... # def clean_up_pending_unrefs(self) -> int: ... def get_max_memory(self, total: bool = False) -> int | MaybeNone: ... diff --git a/stubs/networkx/@tests/stubtest_allowlist.txt b/stubs/networkx/@tests/stubtest_allowlist.txt index 750b9fd968f3..d16f96658f62 100644 --- a/stubs/networkx/@tests/stubtest_allowlist.txt +++ b/stubs/networkx/@tests/stubtest_allowlist.txt @@ -1,3 +1,5 @@ +:35 +35 # overloaded class-decorators are not properly supported in type-checkers: # - mypy: https://github.com/python/mypy/issues/16840 # - pyright: https://github.com/microsoft/pyright/issues/7167 From a7a85ba40cf03945d508fd2f9cf8c6c2dd621465 Mon Sep 17 00:00:00 2001 From: Joey Marianer Date: Tue, 1 Jul 2025 19:48:50 -0700 Subject: [PATCH 3/4] oops --- stubs/networkx/@tests/stubtest_allowlist.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/stubs/networkx/@tests/stubtest_allowlist.txt b/stubs/networkx/@tests/stubtest_allowlist.txt index d16f96658f62..750b9fd968f3 100644 --- a/stubs/networkx/@tests/stubtest_allowlist.txt +++ b/stubs/networkx/@tests/stubtest_allowlist.txt @@ -1,5 +1,3 @@ -:35 -35 # overloaded class-decorators are not properly supported in type-checkers: # - mypy: https://github.com/python/mypy/issues/16840 # - pyright: https://github.com/microsoft/pyright/issues/7167 From d2365fcdcf834f0146b90699d60eefa067f3eb19 Mon Sep 17 00:00:00 2001 From: Joey Marianer Date: Tue, 1 Jul 2025 22:43:17 -0700 Subject: [PATCH 4/4] missed file --- stubs/lupa/@tests/stubtest_allowlist.txt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 stubs/lupa/@tests/stubtest_allowlist.txt diff --git a/stubs/lupa/@tests/stubtest_allowlist.txt b/stubs/lupa/@tests/stubtest_allowlist.txt new file mode 100644 index 000000000000..4a40f0cef308 --- /dev/null +++ b/stubs/lupa/@tests/stubtest_allowlist.txt @@ -0,0 +1,9 @@ +# These are type aliases and not real objects +lupa.lua51.LuaKey +lupa.lua51.LuaObject +lupa.lua52.LuaKey +lupa.lua52.LuaObject +lupa.lua53.LuaKey +lupa.lua53.LuaObject +lupa.lua54.LuaKey +lupa.lua54.LuaObject