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
396 changes: 257 additions & 139 deletions pybind11_stubgen/parser/mixins/fix.py

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions tests/check-demo-errors-generation.sh
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ run_stubgen() {
pybind11-stubgen \
demo \
--output-dir=${STUBS_DIR} \
--numpy-array-wrap-with-annotated \
--exit-code \
2> "${DEMO_ERRORS_FILE}" \
|| exit 0
Expand Down
6 changes: 0 additions & 6 deletions tests/demo.errors.stderr.txt
Original file line number Diff line number Diff line change
@@ -1,10 +1,4 @@
pybind11_stubgen - [ ERROR] In demo._bindings.aliases.foreign_enum_default : Invalid expression '<ConsoleForegroundColor.Blue: 34>'
pybind11_stubgen - [ ERROR] In demo._bindings.eigen.dense_matrix_c : Can't find/import 'm'
pybind11_stubgen - [ ERROR] In demo._bindings.eigen.dense_matrix_c : Can't find/import 'n'
pybind11_stubgen - [ ERROR] In demo._bindings.eigen.dense_matrix_r : Can't find/import 'm'
pybind11_stubgen - [ ERROR] In demo._bindings.eigen.dense_matrix_r : Can't find/import 'n'
pybind11_stubgen - [ ERROR] In demo._bindings.eigen.four_col_matrix_r : Can't find/import 'm'
pybind11_stubgen - [ ERROR] In demo._bindings.eigen.four_row_matrix_r : Can't find/import 'n'
pybind11_stubgen - [ ERROR] In demo._bindings.enum.accept_defaulted_enum : Invalid expression '<ConsoleForegroundColor.None_: -1>'
pybind11_stubgen - [ ERROR] In demo._bindings.flawed_bindings.accept_unbound_enum : Invalid expression '(anonymous namespace)::Enum'
pybind11_stubgen - [ ERROR] In demo._bindings.flawed_bindings.accept_unbound_enum_defaulted : Invalid expression '<demo._bindings.flawed_bindings.Enum object at 0x1234abcd5678>'
Expand Down
5 changes: 4 additions & 1 deletion tests/install-demo-module.sh
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,10 @@ install_pybind11() {
}

install_demo() {
cmake -S "${TESTS_ROOT}/demo-lib" -B "${BUILD_ROOT}/demo"
cmake \
-S "${TESTS_ROOT}/demo-lib" \
-B "${BUILD_ROOT}/demo" \
-DCMAKE_CXX_STANDARD=17
cmake --build "${BUILD_ROOT}/demo"
cmake --install "${BUILD_ROOT}/demo" \
--prefix "${INSTALL_PREFIX}"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
from __future__ import annotations

from demo._bindings import (
aliases,
classes,
eigen,
enum,
flawed_bindings,
functions,
issues,
methods,
numpy,
properties,
stl,
stl_bind,
typing,
values,
)

from . import _bindings, core, pure_python

__all__: list[str] = [
"aliases",
"classes",
"core",
"eigen",
"enum",
"flawed_bindings",
"functions",
"issues",
"methods",
"numpy",
"properties",
"pure_python",
"stl",
"stl_bind",
"typing",
"values",
"version",
]
version: str = "0.0.0"
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from __future__ import annotations

from . import (
aliases,
classes,
eigen,
enum,
flawed_bindings,
functions,
issues,
methods,
numpy,
properties,
stl,
stl_bind,
typing,
values,
)

__all__: list[str] = [
"aliases",
"classes",
"eigen",
"enum",
"flawed_bindings",
"functions",
"issues",
"methods",
"numpy",
"properties",
"stl",
"stl_bind",
"typing",
"values",
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
from __future__ import annotations

import typing

import numpy
from numpy import random

import demo._bindings.enum
from demo._bindings.aliases.foreign_method_arg import Bar2 as foreign_type_alias
from demo._bindings.aliases.foreign_return import get_foo as foreign_class_alias

from . import (
foreign_arg,
foreign_attr,
foreign_class_member,
foreign_method_arg,
foreign_method_return,
foreign_return,
missing_self_arg,
)

__all__: list[str] = [
"Color",
"Dummy",
"foreign_arg",
"foreign_attr",
"foreign_class_alias",
"foreign_class_member",
"foreign_enum_default",
"foreign_method_arg",
"foreign_method_return",
"foreign_return",
"foreign_type_alias",
"func",
"local_func_alias",
"local_type_alias",
"missing_self_arg",
"random",
]

class Color:
pass

class Dummy:
linalg = numpy.linalg

def foreign_enum_default(
color: typing.Any = demo._bindings.enum.ConsoleForegroundColor.Blue,
) -> None: ...
def func(arg0: typing.SupportsInt) -> int: ...

local_func_alias = func
local_type_alias = Color
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from __future__ import annotations

import demo._bindings.classes

__all__: list[str] = ["set_foo"]

def set_foo(arg0: demo._bindings.classes.Foo) -> int: ...
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from __future__ import annotations

import demo._bindings.classes

__all__: list[str] = ["value"]
value: demo._bindings.classes.Foo # value = <demo._bindings.classes.Foo object>
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from __future__ import annotations

import typing

import demo._bindings.classes

__all__: list[str] = ["Bar1"]

class Bar1:
foo: typing.ClassVar[
demo._bindings.classes.Foo
] # value = <demo._bindings.classes.Foo object>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from __future__ import annotations

import demo._bindings.classes

__all__: list[str] = ["Bar2"]

class Bar2:
def set_foo(self, arg0: demo._bindings.classes.Foo) -> int: ...
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from __future__ import annotations

import demo._bindings.classes

__all__: list[str] = ["Bar3"]

class Bar3:
@staticmethod
def get_foo() -> demo._bindings.classes.Foo: ...
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from __future__ import annotations

import demo._bindings.classes

__all__: list[str] = ["get_foo"]

def get_foo() -> demo._bindings.classes.Foo: ...
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from __future__ import annotations

import demo._bindings.classes

__all__: list[str] = ["Bar4"]

class Bar4:
def set_foo(self: demo._bindings.classes.Foo) -> int: ...
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
from __future__ import annotations

import typing

__all__: list[str] = ["Base", "CppException", "Derived", "Foo", "Outer"]

class Base:
class Inner:
pass
name: str

class CppException(Exception):
pass

class Derived(Base):
@property
def count(self) -> int: ...
@count.setter
def count(self, arg0: typing.SupportsInt) -> None: ...

class Foo:
class FooChild:
def __init__(self) -> None: ...
def g(self) -> None: ...

def __init__(self) -> None: ...
def f(self) -> None: ...

class Outer:
class Inner:
class NestedEnum:
"""
Members:

ONE

TWO
"""

ONE: typing.ClassVar[Outer.Inner.NestedEnum] # value = <NestedEnum.ONE: 1>
TWO: typing.ClassVar[Outer.Inner.NestedEnum] # value = <NestedEnum.TWO: 2>
__members__: typing.ClassVar[
dict[str, Outer.Inner.NestedEnum]
] # value = {'ONE': <NestedEnum.ONE: 1>, 'TWO': <NestedEnum.TWO: 2>}
def __eq__(self, other: typing.Any) -> bool: ...
def __getstate__(self) -> int: ...
def __hash__(self) -> int: ...
def __index__(self) -> int: ...
def __init__(self, value: typing.SupportsInt) -> None: ...
def __int__(self) -> int: ...
def __ne__(self, other: typing.Any) -> bool: ...
def __repr__(self) -> str: ...
def __setstate__(self, state: typing.SupportsInt) -> None: ...
def __str__(self) -> str: ...
@property
def name(self) -> str: ...
@property
def value(self) -> int: ...
value: Outer.Inner.NestedEnum
inner: Outer.Inner
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
from __future__ import annotations

import typing

import numpy
import scipy.sparse

__all__: list[str] = [
"accept_matrix_int",
"accept_vector_float64",
"dense_matrix_c",
"dense_matrix_r",
"fixed_mutator_a",
"fixed_mutator_c",
"fixed_mutator_r",
"four_col_matrix_r",
"four_row_matrix_r",
"get_matrix_int",
"get_vector_float64",
"sparse_matrix_c",
"sparse_matrix_r",
]
M = typing.TypeVar("M", bound=int)
N = typing.TypeVar("N", bound=int)

def accept_matrix_int(
arg0: numpy.ndarray[
tuple[typing.Literal[3], typing.Literal[3]], numpy.dtype[numpy.int32]
]
) -> None: ...
def accept_vector_float64(
arg0: numpy.ndarray[
tuple[typing.Literal[3], typing.Literal[1]], numpy.dtype[numpy.float64]
]
) -> None: ...
def dense_matrix_c(
arg0: numpy.ndarray[tuple[M, N], numpy.dtype[numpy.float32]]
) -> numpy.ndarray[tuple[M, N], numpy.dtype[numpy.float32]]: ...
def dense_matrix_r(
arg0: numpy.ndarray[tuple[M, N], numpy.dtype[numpy.float32]]
) -> numpy.ndarray[tuple[M, N], numpy.dtype[numpy.float32]]: ...
def fixed_mutator_a(
arg0: numpy.ndarray[
tuple[typing.Literal[5], typing.Literal[6]], numpy.dtype[numpy.float32]
]
) -> None: ...
def fixed_mutator_c(
arg0: numpy.ndarray[
tuple[typing.Literal[5], typing.Literal[6]], numpy.dtype[numpy.float32]
]
) -> None: ...
def fixed_mutator_r(
arg0: numpy.ndarray[
tuple[typing.Literal[5], typing.Literal[6]], numpy.dtype[numpy.float32]
]
) -> None: ...
def four_col_matrix_r(
arg0: numpy.ndarray[tuple[M, typing.Literal[4]], numpy.dtype[numpy.float32]]
) -> numpy.ndarray[tuple[M, typing.Literal[4]], numpy.dtype[numpy.float32]]: ...
def four_row_matrix_r(
arg0: numpy.ndarray[tuple[typing.Literal[4], N], numpy.dtype[numpy.float32]]
) -> numpy.ndarray[tuple[typing.Literal[4], N], numpy.dtype[numpy.float32]]: ...
def get_matrix_int() -> numpy.ndarray[
tuple[typing.Literal[3], typing.Literal[3]], numpy.dtype[numpy.int32]
]: ...
def get_vector_float64() -> numpy.ndarray[
tuple[typing.Literal[3], typing.Literal[1]], numpy.dtype[numpy.float64]
]: ...
def sparse_matrix_c(arg0: scipy.sparse.csc_matrix) -> scipy.sparse.csc_matrix: ...
def sparse_matrix_r(arg0: scipy.sparse.csr_matrix) -> scipy.sparse.csr_matrix: ...
Loading