From 13e4f4462bccf77f4a25f23b40d8c4c42665223d Mon Sep 17 00:00:00 2001 From: jorenham Date: Fri, 7 Mar 2025 15:09:59 +0100 Subject: [PATCH 01/23] =?UTF-8?q?=F0=9F=90=9B=20remove=20spurious=20`f2py.?= =?UTF-8?q?compile`=20function?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/f2py/__init__.pyi | 30 +----------------------------- tool/allowlists/common-todo.txt | 1 - 2 files changed, 1 insertion(+), 30 deletions(-) diff --git a/src/numpy-stubs/f2py/__init__.pyi b/src/numpy-stubs/f2py/__init__.pyi index 6f416d49..2a896f20 100644 --- a/src/numpy-stubs/f2py/__init__.pyi +++ b/src/numpy-stubs/f2py/__init__.pyi @@ -1,7 +1,5 @@ -import subprocess -from _typeshed import StrOrBytesPath from collections.abc import Iterable -from typing import Literal as L, TypedDict, overload, type_check_only +from typing import TypedDict, type_check_only __all__ = ["get_include", "run_main"] @@ -15,31 +13,5 @@ class _F2PyDict(_F2PyDictBase, total=False): fsrc: list[str] ltx: list[str] -# def get_include() -> str: ... - -# def run_main(comline_list: Iterable[str]) -> dict[str, _F2PyDict]: ... - -# -@overload -def compile( - source: str | bytes, - modulename: str = ..., - extra_args: str | list[str] = ..., - verbose: bool = ..., - source_fn: StrOrBytesPath | None = ..., - extension: L[".f", ".f90"] = ..., - full_output: L[False] = ..., -) -> int: ... -@overload -def compile( - source: str | bytes, - modulename: str = ..., - extra_args: str | list[str] = ..., - verbose: bool = ..., - source_fn: StrOrBytesPath | None = ..., - extension: L[".f", ".f90"] = ..., - *, - full_output: L[True], -) -> subprocess.CompletedProcess[bytes]: ... diff --git a/tool/allowlists/common-todo.txt b/tool/allowlists/common-todo.txt index be6dcb97..d9f4a362 100644 --- a/tool/allowlists/common-todo.txt +++ b/tool/allowlists/common-todo.txt @@ -15,7 +15,6 @@ numpy.f2py.(aux|c)funcs numpy.f2py.capi_maps numpy.f2py.func2subr numpy.f2py.f2py2e -numpy.f2py.compile numpy.f2py.diagnose numpy.f2py.crackfortran numpy.f2py.symbolic From a4d71eb3284894c6a56da677745005f96737b63e Mon Sep 17 00:00:00 2001 From: jorenham Date: Fri, 7 Mar 2025 15:13:22 +0100 Subject: [PATCH 02/23] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20stub=20`numpy.f2p?= =?UTF-8?q?y.=5F=5Fversion=5F=5F`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/f2py/__version__.pyi | 1 + tool/allowlists/common-todo.txt | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 src/numpy-stubs/f2py/__version__.pyi diff --git a/src/numpy-stubs/f2py/__version__.pyi b/src/numpy-stubs/f2py/__version__.pyi new file mode 100644 index 00000000..85b42252 --- /dev/null +++ b/src/numpy-stubs/f2py/__version__.pyi @@ -0,0 +1 @@ +from numpy.version import version as version diff --git a/tool/allowlists/common-todo.txt b/tool/allowlists/common-todo.txt index d9f4a362..90231004 100644 --- a/tool/allowlists/common-todo.txt +++ b/tool/allowlists/common-todo.txt @@ -8,9 +8,8 @@ numpy(\..+)?\.floating.as_integer_ratio numpy(\..+)?\.complexfloating.__hash__ numpy(\..+)?\.complexfloating.__complex__ - +# https://github.com/numpy/numtype/issues/40 numpy.f2py.__main__ -numpy.f2py.__version__ numpy.f2py.(aux|c)funcs numpy.f2py.capi_maps numpy.f2py.func2subr From 6a9b3800635f86c611a41886840d67b94a6c4d8b Mon Sep 17 00:00:00 2001 From: jorenham Date: Fri, 7 Mar 2025 16:02:30 +0100 Subject: [PATCH 03/23] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20stub=20`numpy.f2p?= =?UTF-8?q?y.cfuncs`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/f2py/cfuncs.pyi | 31 +++++++++++++++++++++++++++++++ tool/allowlists/common-todo.txt | 2 +- 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 src/numpy-stubs/f2py/cfuncs.pyi diff --git a/src/numpy-stubs/f2py/cfuncs.pyi b/src/numpy-stubs/f2py/cfuncs.pyi new file mode 100644 index 00000000..58871777 --- /dev/null +++ b/src/numpy-stubs/f2py/cfuncs.pyi @@ -0,0 +1,31 @@ +from typing import Final, TypeAlias + +from .__version__ import version + +### + +_NeedListDict: TypeAlias = dict[str, list[str]] +_NeedDict: TypeAlias = dict[str, str] + +### + +f2py_version: Final = version + +outneeds: Final[_NeedListDict] = ... +needs: Final[_NeedListDict] = ... + +includes0: Final[_NeedDict] = ... +includes: Final[_NeedDict] = ... +userincludes: Final[_NeedDict] = ... +typedefs: Final[_NeedDict] = ... +typedefs_generated: Final[_NeedDict] = ... +cppmacros: Final[_NeedDict] = ... +cfuncs: Final[_NeedDict] = ... +callbacks: Final[_NeedDict] = ... +f90modhooks: Final[_NeedDict] = ... +commonhooks: Final[_NeedDict] = ... + +def errmess(s: str) -> None: ... +def buildcfuncs() -> None: ... +def get_needs() -> _NeedListDict: ... +def append_needs(need: str | list[str], flag: int = 1) -> _NeedListDict: ... diff --git a/tool/allowlists/common-todo.txt b/tool/allowlists/common-todo.txt index 90231004..1925bf52 100644 --- a/tool/allowlists/common-todo.txt +++ b/tool/allowlists/common-todo.txt @@ -10,7 +10,7 @@ numpy(\..+)?\.complexfloating.__complex__ # https://github.com/numpy/numtype/issues/40 numpy.f2py.__main__ -numpy.f2py.(aux|c)funcs +numpy.f2py.auxfuncs numpy.f2py.capi_maps numpy.f2py.func2subr numpy.f2py.f2py2e From 5008c6b11518b6f2d0961a2d685ac17f0f5eac4c Mon Sep 17 00:00:00 2001 From: jorenham Date: Fri, 7 Mar 2025 16:58:42 +0100 Subject: [PATCH 04/23] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20stub=20`numpy.f2p?= =?UTF-8?q?y.auxfuncs`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/f2py/auxfuncs.pyi | 263 ++++++++++++++++++++++++++++++ tool/allowlists/common-todo.txt | 1 - 2 files changed, 263 insertions(+), 1 deletion(-) create mode 100644 src/numpy-stubs/f2py/auxfuncs.pyi diff --git a/src/numpy-stubs/f2py/auxfuncs.pyi b/src/numpy-stubs/f2py/auxfuncs.pyi new file mode 100644 index 00000000..9de0b107 --- /dev/null +++ b/src/numpy-stubs/f2py/auxfuncs.pyi @@ -0,0 +1,263 @@ +from _typeshed import FileDescriptorOrPath, Incomplete +from collections.abc import Callable, Mapping +from pprint import pprint as show +from typing import Final, Literal as L, Never, TypeAlias, overload +from typing_extensions import TypeVar + +from .cfuncs import errmess + +__all__ = [ + "applyrules", + "containscommon", + "debugcapi", + "dictappend", + "errmess", + "gentitle", + "get_f2py_modulename", + "getargs2", + "getcallprotoargument", + "getcallstatement", + "getdimension", + "getfortranname", + "getpymethoddef", + "getrestdoc", + "getuseblocks", + "getusercode", + "getusercode1", + "hasbody", + "hascallstatement", + "hascommon", + "hasexternals", + "hasinitvalue", + "hasnote", + "hasresultnote", + "isallocatable", + "isarray", + "isarrayofstrings", + "isattr_value", + "ischaracter", + "ischaracter_or_characterarray", + "ischaracterarray", + "iscomplex", + "iscomplexarray", + "iscomplexfunction", + "iscomplexfunction_warn", + "iscstyledirective", + "isdouble", + "isdummyroutine", + "isexternal", + "isfunction", + "isfunction_wrap", + "isint1", + "isint1array", + "isinteger", + "isintent_aux", + "isintent_c", + "isintent_callback", + "isintent_copy", + "isintent_dict", + "isintent_hide", + "isintent_in", + "isintent_inout", + "isintent_inplace", + "isintent_nothide", + "isintent_out", + "isintent_overwrite", + "islogical", + "islogicalfunction", + "islong_complex", + "islong_double", + "islong_doublefunction", + "islong_long", + "islong_longfunction", + "ismodule", + "ismoduleroutine", + "isoptional", + "isprivate", + "isrequired", + "isroutine", + "isscalar", + "issigned_long_longarray", + "isstring", + "isstring_or_stringarray", + "isstringarray", + "isstringfunction", + "issubroutine", + "issubroutine_wrap", + "isthreadsafe", + "isunsigned", + "isunsigned_char", + "isunsigned_chararray", + "isunsigned_long_long", + "isunsigned_long_longarray", + "isunsigned_short", + "isunsigned_shortarray", + "isvariable", + "l_and", + "l_not", + "l_or", + "outmess", + "process_f2cmap_dict", + "replace", + "show", + "stripcomma", + "throw_error", +] + +### + +_VT = TypeVar("_VT") +_RT = TypeVar("_RT") + +_Var: TypeAlias = Mapping[str, list[str]] +_ROut: TypeAlias = Mapping[str, str] +_F2CMap: TypeAlias = Mapping[str, Mapping[str, str]] + +_Bool: TypeAlias = bool | L[0, 1] +_Intent: TypeAlias = L[ + "INTENT_IN", + "INTENT_OUT", + "INTENT_INOUT", + "INTENT_C", + "INTENT_CACHE", + "INTENT_HIDE", + "INTENT_INPLACE", + "INTENT_ALIGNED4", + "INTENT_ALIGNED8", + "INTENT_ALIGNED16", + "OPTIONAL", +] + +### + +isintent_dict: dict[Callable[[_Var], bool], _Intent] + +class F2PYError(Exception): ... + +class throw_error: + mess: Final[str] + def __init__(self, /, mess: str) -> None: ... + def __call__(self, /, var: _Var) -> Never: ... # raises F2PYError + +# +def l_and(*f: tuple[str, Callable[[_VT], _RT]]) -> Callable[[_VT], _RT]: ... +def l_or(*f: tuple[str, Callable[[_VT], _RT]]) -> Callable[[_VT], _RT]: ... +def l_not(f: tuple[str, Callable[[_VT], _RT]]) -> Callable[[_VT], _RT]: ... + +# +def outmess(t: str) -> None: ... +def debugcapi(var: _Var) -> bool: ... + +# +def hasinitvalue(var: _Var | str) -> bool: ... +def hasnote(var: _Var | str) -> bool: ... +def ischaracter(var: _Var) -> bool: ... +def ischaracterarray(var: _Var) -> bool: ... +def ischaracter_or_characterarray(var: _Var) -> bool: ... +def isstring(var: _Var) -> bool: ... +def isstringarray(var: _Var) -> bool: ... +def isstring_or_stringarray(var: _Var) -> bool: ... +def isarray(var: _Var) -> bool: ... +def isarrayofstrings(var: _Var) -> bool: ... +def isscalar(var: _Var) -> bool: ... +def iscomplex(var: _Var) -> bool: ... +def islogical(var: _Var) -> bool: ... +def isinteger(var: _Var) -> bool: ... +def isint1(var: _Var) -> bool: ... +def isint1array(var: _Var) -> bool: ... +def islong_long(var: _Var) -> _Bool: ... +def isunsigned(var: _Var) -> _Bool: ... +def isunsigned_char(var: _Var) -> _Bool: ... +def isunsigned_chararray(var: _Var) -> bool: ... +def isunsigned_short(var: _Var) -> _Bool: ... +def isunsigned_shortarray(var: _Var) -> bool: ... +def isunsigned_long_long(var: _Var) -> _Bool: ... +def isunsigned_long_longarray(var: _Var) -> bool: ... +def issigned_long_longarray(var: _Var) -> bool: ... +def isdouble(var: _Var) -> _Bool: ... +def islong_double(var: _Var) -> _Bool: ... +def islong_complex(var: _Var) -> _Bool: ... +def iscomplexarray(var: _Var) -> bool: ... +def isallocatable(var: _Var) -> bool: ... +def isattr_value(var: _Var) -> bool: ... +def isoptional(var: _Var) -> bool: ... +def isexternal(var: _Var) -> bool: ... +def isrequired(var: _Var) -> bool: ... +def isprivate(var: _Var) -> bool: ... +def isvariable(var: _Var) -> bool: ... +def isintent_in(var: _Var) -> _Bool: ... +def isintent_inout(var: _Var) -> bool: ... +def isintent_out(var: _Var) -> bool: ... +def isintent_hide(var: _Var) -> bool: ... +def isintent_nothide(var: _Var) -> bool: ... +def isintent_c(var: _Var) -> bool: ... +def isintent_cache(var: _Var) -> bool: ... +def isintent_copy(var: _Var) -> bool: ... +def isintent_overwrite(var: _Var) -> bool: ... +def isintent_callback(var: _Var) -> bool: ... +def isintent_inplace(var: _Var) -> bool: ... +def isintent_aux(var: _Var) -> bool: ... + +# +def containscommon(rout: _ROut) -> _Bool: ... +def hasexternals(rout: _ROut) -> bool: ... +def hasresultnote(rout: _ROut) -> _Bool: ... +def hasbody(rout: _ROut) -> _Bool: ... +def hascommon(rout: _ROut) -> bool: ... +def hascallstatement(rout: _ROut) -> bool: ... +def isroutine(rout: _ROut) -> bool: ... +def ismodule(rout: _ROut) -> bool: ... +def ismoduleroutine(rout: _ROut) -> bool: ... +def issubroutine(rout: _ROut) -> bool: ... +def issubroutine_wrap(rout: _ROut) -> _Bool: ... +def isfunction(rout: _ROut) -> bool: ... +def isfunction_wrap(rout: _ROut) -> _Bool: ... +def islogicalfunction(rout: _ROut) -> _Bool: ... +def islong_longfunction(rout: _ROut) -> _Bool: ... +def islong_doublefunction(rout: _ROut) -> _Bool: ... +def iscomplexfunction(rout: _ROut) -> _Bool: ... +def iscomplexfunction_warn(rout: _ROut) -> _Bool: ... +def isstringfunction(rout: _ROut) -> _Bool: ... +def isthreadsafe(rout: _ROut) -> bool: ... +def isdummyroutine(rout: _ROut) -> _Bool: ... +def iscstyledirective(f2py_line: str) -> bool: ... + +# . +def getdimension(var: _Var) -> list[Incomplete] | None: ... +def getfortranname(rout: _ROut) -> str: ... +def getmultilineblock(rout: _ROut, blockname: str, comment: _Bool = 1, counter: int = 0) -> str | None: ... +def getcallstatement(rout: _ROut) -> str | None: ... +def getcallprotoargument(rout: _ROut, cb_map: dict[str, str] = {}) -> str: ... +def getusercode(rout: _ROut) -> str | None: ... +def getusercode1(rout: _ROut) -> str | None: ... +def getpymethoddef(rout: _ROut) -> str | None: ... +def getargs(rout: _ROut) -> tuple[list[str], list[str]]: ... +def getargs2(rout: _ROut) -> tuple[list[str], list[str]]: ... +def getrestdoc(rout: _ROut) -> str | None: ... + +# +def gentitle(name: str) -> str: ... +def stripcomma(s: str) -> str: ... +@overload +def replace(str: str, d: list[str], defaultsep: str = "") -> list[str]: ... +@overload +def replace(str: list[str], d: str, defaultsep: str = "") -> list[str]: ... +@overload +def replace(str: str, d: str, defaultsep: str = "") -> str: ... + +# +def dictappend( + rd: Mapping[str, Incomplete], + ar: Mapping[str, Incomplete] | list[Mapping[str, Incomplete]], +) -> dict[str, Incomplete]: ... +def applyrules(rules: Mapping[str, Incomplete], d: Mapping[str, Incomplete], var: _Var = {}) -> dict[str, Incomplete]: ... + +# +def get_f2py_modulename(source: FileDescriptorOrPath) -> str: ... +def getuseblocks(pymod: Mapping[str, Mapping[str, Mapping[str, str]]]) -> list[str]: ... +def process_f2cmap_dict( + f2cmap_all: _F2CMap, + new_map: _F2CMap, + c2py_map: _F2CMap, + verbose: bool = False, +) -> tuple[dict[str, dict[str, str]], list[str]]: ... diff --git a/tool/allowlists/common-todo.txt b/tool/allowlists/common-todo.txt index 1925bf52..69f92ba9 100644 --- a/tool/allowlists/common-todo.txt +++ b/tool/allowlists/common-todo.txt @@ -10,7 +10,6 @@ numpy(\..+)?\.complexfloating.__complex__ # https://github.com/numpy/numtype/issues/40 numpy.f2py.__main__ -numpy.f2py.auxfuncs numpy.f2py.capi_maps numpy.f2py.func2subr numpy.f2py.f2py2e From fa8d11c2c2ec02d9ee722a1578835af00a44d3c6 Mon Sep 17 00:00:00 2001 From: jorenham Date: Fri, 7 Mar 2025 17:12:50 +0100 Subject: [PATCH 05/23] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20stub=20`numpy.f2p?= =?UTF-8?q?y.capi=5Fmaps`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/f2py/capi_maps.pyi | 33 ++++++++++++++++++++++++++++++ tool/allowlists/common-todo.txt | 1 - 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 src/numpy-stubs/f2py/capi_maps.pyi diff --git a/src/numpy-stubs/f2py/capi_maps.pyi b/src/numpy-stubs/f2py/capi_maps.pyi new file mode 100644 index 00000000..92660036 --- /dev/null +++ b/src/numpy-stubs/f2py/capi_maps.pyi @@ -0,0 +1,33 @@ +from .auxfuncs import _ROut, _Var, process_f2cmap_dict + +__all__ = [ + "cb_routsign2map", + "cb_sign2map", + "common_sign2map", + "getarrdims", + "getarrdocsign", + "getctype", + "getinit", + "getpydocsign", + "getstrlength", + "modsign2map", + "process_f2cmap_dict", + "routsign2map", + "sign2map", +] + +### + +def getctype(var: _Var) -> str: ... +def f2cexpr(expr: str) -> str: ... +def getstrlength(var: _Var) -> str: ... +def getarrdims(a: str, var: _Var, verbose: int = 0) -> dict[str, str]: ... +def getpydocsign(a: str, var: _Var) -> tuple[str, str]: ... +def getarrdocsign(a: str, var: _Var) -> str: ... +def getinit(a: str, var: _Var) -> tuple[str, str]: ... +def sign2map(a: str, var: _Var) -> dict[str, str]: ... +def routsign2map(rout: _ROut) -> dict[str, str]: ... +def modsign2map(m: _ROut) -> dict[str, str]: ... +def cb_sign2map(a: str, var: _Var, index: object | None = None) -> dict[str, str]: ... +def cb_routsign2map(rout: _ROut, um: str) -> dict[str, str]: ... +def common_sign2map(a: str, var: _Var) -> dict[str, str]: ... # obsolete diff --git a/tool/allowlists/common-todo.txt b/tool/allowlists/common-todo.txt index 69f92ba9..025e40ee 100644 --- a/tool/allowlists/common-todo.txt +++ b/tool/allowlists/common-todo.txt @@ -10,7 +10,6 @@ numpy(\..+)?\.complexfloating.__complex__ # https://github.com/numpy/numtype/issues/40 numpy.f2py.__main__ -numpy.f2py.capi_maps numpy.f2py.func2subr numpy.f2py.f2py2e numpy.f2py.diagnose From 4f27b4fadd44092dd1f3c77812e9465f4b215937 Mon Sep 17 00:00:00 2001 From: jorenham Date: Fri, 7 Mar 2025 18:09:00 +0100 Subject: [PATCH 06/23] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20stub=20`numpy.f2p?= =?UTF-8?q?y.f2py2e`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/f2py/__init__.pyi | 14 +----- src/numpy-stubs/f2py/f2py2e.pyi | 74 +++++++++++++++++++++++++++++++ tool/allowlists/common-todo.txt | 5 +-- 3 files changed, 77 insertions(+), 16 deletions(-) create mode 100644 src/numpy-stubs/f2py/f2py2e.pyi diff --git a/src/numpy-stubs/f2py/__init__.pyi b/src/numpy-stubs/f2py/__init__.pyi index 2a896f20..aa7d5918 100644 --- a/src/numpy-stubs/f2py/__init__.pyi +++ b/src/numpy-stubs/f2py/__init__.pyi @@ -1,17 +1,5 @@ -from collections.abc import Iterable -from typing import TypedDict, type_check_only +from .f2py2e import main as main, run_main __all__ = ["get_include", "run_main"] -@type_check_only -class _F2PyDictBase(TypedDict): - csrc: list[str] - h: list[str] - -@type_check_only -class _F2PyDict(_F2PyDictBase, total=False): - fsrc: list[str] - ltx: list[str] - def get_include() -> str: ... -def run_main(comline_list: Iterable[str]) -> dict[str, _F2PyDict]: ... diff --git a/src/numpy-stubs/f2py/f2py2e.pyi b/src/numpy-stubs/f2py/f2py2e.pyi new file mode 100644 index 00000000..b1b403b5 --- /dev/null +++ b/src/numpy-stubs/f2py/f2py2e.pyi @@ -0,0 +1,74 @@ +import argparse +import pprint +from _typeshed import Incomplete +from collections.abc import Hashable, Iterable, Mapping, MutableMapping, Sequence +from types import ModuleType +from typing import Final, NotRequired, TypedDict, type_check_only +from typing_extensions import TypeVar + +from .__version__ import version +from .auxfuncs import _Bool, outmess as outmess + +### + +_KT = TypeVar("_KT", bound=Hashable) +_VT = TypeVar("_VT") + +@type_check_only +class _F2PyDict(TypedDict): + csrc: list[str] + h: list[str] + fsrc: NotRequired[list[str]] + ltx: NotRequired[list[str]] + +@type_check_only +class _PreparseResult(TypedDict): + dependencies: list[str] + backend: str + modulename: str + +### + +MESON_ONLY_VER: Final[bool] +f2py_version: Final = version +numpy_version: Final = version +__usage__: Final[str] + +show = pprint.pprint + +class CombineIncludePaths(argparse.Action): + def __call__( + self, + /, + parser: argparse.ArgumentParser, + namespace: argparse.Namespace, + values: str | Sequence[str] | None, + option_string: str | None = None, + ) -> None: ... + +# +def run_main(comline_list: Iterable[str]) -> dict[str, _F2PyDict]: ... +def run_compile() -> None: ... +def main() -> None: ... + +# +def scaninputline(inputline: Iterable[str]) -> tuple[list[str], dict[str, _Bool]]: ... +def callcrackfortran(files: list[str], options: dict[str, bool]) -> list[dict[str, Incomplete]]: ... +def buildmodules(lst: Iterable[Mapping[str, object]]) -> dict[str, dict[str, Incomplete]]: ... +def dict_append(d_out: MutableMapping[_KT, _VT], d_in: Mapping[_KT, _VT]) -> None: ... +def filter_files( + prefix: str, + suffix: str, + files: Iterable[str], + remove_prefix: _Bool | None = None, +) -> tuple[list[str], list[str]]: ... +def get_prefix(module: ModuleType) -> str: ... +def get_newer_options(iline: Iterable[str]) -> tuple[list[str], Incomplete, list[str]]: ... + +# +def f2py_parser() -> argparse.ArgumentParser: ... +def make_f2py_compile_parser() -> argparse.ArgumentParser: ... + +# +def preparse_sysargv() -> _PreparseResult: ... +def validate_modulename(pyf_files: Sequence[str], modulename: str = "untitled") -> str: ... diff --git a/tool/allowlists/common-todo.txt b/tool/allowlists/common-todo.txt index 025e40ee..0abad384 100644 --- a/tool/allowlists/common-todo.txt +++ b/tool/allowlists/common-todo.txt @@ -10,9 +10,8 @@ numpy(\..+)?\.complexfloating.__complex__ # https://github.com/numpy/numtype/issues/40 numpy.f2py.__main__ -numpy.f2py.func2subr -numpy.f2py.f2py2e -numpy.f2py.diagnose numpy.f2py.crackfortran +numpy.f2py.diagnose +numpy.f2py.func2subr numpy.f2py.symbolic numpy.f2py.((cb|common|f90mod|use)_)?rules From 070967032e3f4cc36d514d2e1fb0cb69687ea5c3 Mon Sep 17 00:00:00 2001 From: jorenham Date: Fri, 7 Mar 2025 18:23:53 +0100 Subject: [PATCH 07/23] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20stub=20`numpy.f2p?= =?UTF-8?q?y.diagnose`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/f2py/diagnose.pyi | 4 ++++ tool/allowlists/common-todo.txt | 1 - 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 src/numpy-stubs/f2py/diagnose.pyi diff --git a/src/numpy-stubs/f2py/diagnose.pyi b/src/numpy-stubs/f2py/diagnose.pyi new file mode 100644 index 00000000..29cc2b49 --- /dev/null +++ b/src/numpy-stubs/f2py/diagnose.pyi @@ -0,0 +1,4 @@ +from _typeshed import StrOrBytesPath + +def run_command(cmd: StrOrBytesPath) -> None: ... +def run() -> None: ... diff --git a/tool/allowlists/common-todo.txt b/tool/allowlists/common-todo.txt index 0abad384..5fbc0270 100644 --- a/tool/allowlists/common-todo.txt +++ b/tool/allowlists/common-todo.txt @@ -11,7 +11,6 @@ numpy(\..+)?\.complexfloating.__complex__ # https://github.com/numpy/numtype/issues/40 numpy.f2py.__main__ numpy.f2py.crackfortran -numpy.f2py.diagnose numpy.f2py.func2subr numpy.f2py.symbolic numpy.f2py.((cb|common|f90mod|use)_)?rules From 32ab8146bcf34c5954da5cdddf8a7e86ac8b01fd Mon Sep 17 00:00:00 2001 From: jorenham Date: Fri, 7 Mar 2025 18:43:24 +0100 Subject: [PATCH 08/23] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20stub=20`numpy.f2p?= =?UTF-8?q?y.func2subr`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/f2py/func2subr.pyi | 7 +++++++ tool/allowlists/common-todo.txt | 1 - 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 src/numpy-stubs/f2py/func2subr.pyi diff --git a/src/numpy-stubs/f2py/func2subr.pyi b/src/numpy-stubs/f2py/func2subr.pyi new file mode 100644 index 00000000..8d2b3dba --- /dev/null +++ b/src/numpy-stubs/f2py/func2subr.pyi @@ -0,0 +1,7 @@ +from .auxfuncs import _Bool, _ROut, _Var + +def var2fixfortran(vars: _Var, a: str, fa: str | None = None, f90mode: _Bool | None = None) -> str: ... +def useiso_c_binding(rout: _ROut) -> bool: ... +def createfuncwrapper(rout: _ROut, signature: int = 0) -> str: ... +def createsubrwrapper(rout: _ROut, signature: int = 0) -> str: ... +def assubr(rout: _ROut) -> tuple[dict[str, str], str]: ... diff --git a/tool/allowlists/common-todo.txt b/tool/allowlists/common-todo.txt index 5fbc0270..f5096372 100644 --- a/tool/allowlists/common-todo.txt +++ b/tool/allowlists/common-todo.txt @@ -11,6 +11,5 @@ numpy(\..+)?\.complexfloating.__complex__ # https://github.com/numpy/numtype/issues/40 numpy.f2py.__main__ numpy.f2py.crackfortran -numpy.f2py.func2subr numpy.f2py.symbolic numpy.f2py.((cb|common|f90mod|use)_)?rules From f6a4fefc69323728198fb68f0deb64f59e395d7a Mon Sep 17 00:00:00 2001 From: jorenham Date: Fri, 7 Mar 2025 19:33:24 +0100 Subject: [PATCH 09/23] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20stub=20`numpy.f2p?= =?UTF-8?q?y.symbolic`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/f2py/symbolic.pyi | 219 ++++++++++++++++++++++++++++++ tool/allowlists/common-todo.txt | 7 +- 2 files changed, 224 insertions(+), 2 deletions(-) create mode 100644 src/numpy-stubs/f2py/symbolic.pyi diff --git a/src/numpy-stubs/f2py/symbolic.pyi b/src/numpy-stubs/f2py/symbolic.pyi new file mode 100644 index 00000000..24d584e9 --- /dev/null +++ b/src/numpy-stubs/f2py/symbolic.pyi @@ -0,0 +1,219 @@ +from collections.abc import Callable, Mapping +from enum import Enum +from typing import Any, Generic, Literal as L, ParamSpec, Self, TypeAlias, overload +from typing_extensions import TypeVar + +__all__ = ["Expr"] + +### + +_Tss = ParamSpec("_Tss") +_ExprT = TypeVar("_ExprT", bound=Expr) +_ExprT1 = TypeVar("_ExprT1", bound=Expr) +_ExprT2 = TypeVar("_ExprT2", bound=Expr) +_OpT_co = TypeVar("_OpT_co", bound=Op, default=Op, covariant=True) +_LanguageT_co = TypeVar("_LanguageT_co", bound=Language, default=Language, covariant=True) +_DataT_co = TypeVar("_DataT_co", default=Any, covariant=True) +_LeftT_co = TypeVar("_LeftT_co", default=Any, covariant=True) +_RightT_co = TypeVar("_RightT_co", default=Any, covariant=True) + +_RelCOrPy: TypeAlias = L["==", "!=", "<", "<=", ">", ">="] +_RelFortran: TypeAlias = L[".eq.", ".ne.", ".lt.", ".le.", ".gt.", ".ge."] + +_ToExpr: TypeAlias = Expr | complex | str +_ToExprN: TypeAlias = _ToExpr | tuple[_ToExprN, ...] +_NestedString: TypeAlias = str | tuple[_NestedString, ...] | list[_NestedString] + +### + +class OpError(Exception): ... +class ExprWarning(UserWarning): ... + +class Language(Enum): + Python = 0 + Fortran = 1 + C = 2 + +class Op(Enum): + INTEGER = 10 + REAL = 12 + COMPLEX = 15 + STRING = 20 + ARRAY = 30 + SYMBOL = 40 + TERNARY = 100 + APPLY = 200 + INDEXING = 210 + CONCAT = 220 + RELATIONAL = 300 + TERMS = 1_000 + FACTORS = 2_000 + REF = 3_000 + DEREF = 3_001 + +class RelOp(Enum): + EQ = 1 + NE = 2 + LT = 3 + LE = 4 + GT = 5 + GE = 6 + + @overload + @classmethod + def fromstring(cls, s: _RelCOrPy, language: L[Language.C, Language.Python] = ...) -> RelOp: ... + @overload + @classmethod + def fromstring(cls, s: _RelFortran, language: L[Language.Fortran]) -> RelOp: ... + + # + @overload + def tostring(self, /, language: L[Language.C, Language.Python] = ...) -> _RelCOrPy: ... + @overload + def tostring(self, /, language: L[Language.Fortran]) -> _RelFortran: ... + +class ArithOp(Enum): + POS = 1 + NEG = 2 + ADD = 3 + SUB = 4 + MUL = 5 + DIV = 6 + POW = 7 + +class Precedence(Enum): + ATOM = 0 + POWER = 1 + UNARY = 2 + PRODUCT = 3 + SUM = 4 + LT = 6 + EQ = 7 + LAND = 11 + LOR = 12 + TERNARY = 13 + ASSIGN = 14 + TUPLE = 15 + NONE = 100 + +class Expr(Generic[_OpT_co, _DataT_co]): + op: _OpT_co + data: _DataT_co + + @staticmethod + def parse(s: str, language: Language = ...) -> Expr: ... + + # + def __init__(self, /, op: Op, data: _DataT_co) -> None: ... + + # + def __lt__(self, other: Expr, /) -> bool: ... + def __le__(self, other: Expr, /) -> bool: ... + def __gt__(self, other: Expr, /) -> bool: ... + def __ge__(self, other: Expr, /) -> bool: ... + + # + def __pos__(self, /) -> Self: ... + def __neg__(self, /) -> Expr: ... + + # + def __add__(self, other: Expr, /) -> Expr: ... + def __radd__(self, other: Expr, /) -> Expr: ... + + # + def __sub__(self, other: Expr, /) -> Expr: ... + def __rsub__(self, other: Expr, /) -> Expr: ... + + # + def __mul__(self, other: Expr, /) -> Expr: ... + def __rmul__(self, other: Expr, /) -> Expr: ... + + # + def __pow__(self, other: Expr, /) -> Expr: ... + + # + def __truediv__(self, other: Expr, /) -> Expr: ... + def __rtruediv__(self, other: Expr, /) -> Expr: ... + + # + def __floordiv__(self, other: Expr, /) -> Expr: ... + def __rfloordiv__(self, other: Expr, /) -> Expr: ... + + # + def __call__( + self, + /, + *args: _ToExprN, + **kwargs: _ToExprN, + ) -> Expr[L[Op.APPLY], tuple[Self, tuple[Expr, ...], dict[str, Expr]]]: ... + + # + @overload + def __getitem__(self, index: _ExprT | tuple[_ExprT], /) -> Expr[L[Op.INDEXING], tuple[Self, _ExprT]]: ... + @overload + def __getitem__(self, index: _ToExpr | tuple[_ToExpr], /) -> Expr[L[Op.INDEXING], tuple[Self, Expr]]: ... + + # + def substitute(self, /, symbols_map: Mapping[Expr, Expr]) -> Expr: ... + + # + @overload + def traverse(self, /, visit: Callable[_Tss, None], *args: _Tss.args, **kwargs: _Tss.kwargs) -> Expr: ... + @overload + def traverse(self, /, visit: Callable[_Tss, _ExprT], *args: _Tss.args, **kwargs: _Tss.kwargs) -> _ExprT: ... + + # + def contains(self, /, other: Expr) -> bool: ... + + # + def symbols(self, /) -> set[Expr]: ... + def polynomial_atoms(self, /) -> set[Expr]: ... + + # + def linear_solve(self, /, symbol: Expr) -> tuple[Expr, Expr]: ... + + # + def tostring(self, /, parent_precedence: Precedence = ..., language: Language = ...) -> str: ... + +class _Pair(Generic[_LeftT_co, _RightT_co]): + left: _LeftT_co + right: _RightT_co + + def __init__(self, /, left: _LeftT_co, right: _RightT_co) -> None: ... + + # + @overload + def substitute(self: _Pair[_ExprT1, _ExprT2], /, symbols_map: Mapping[Expr, Expr]) -> _Pair[Expr, Expr]: ... + @overload + def substitute(self: _Pair[_ExprT1, object], /, symbols_map: Mapping[Expr, Expr]) -> _Pair[Expr, Any]: ... + @overload + def substitute(self: _Pair[object, _ExprT2], /, symbols_map: Mapping[Expr, Expr]) -> _Pair[Any, Expr]: ... + @overload + def substitute(self, /, symbols_map: Mapping[Expr, Expr]) -> _Pair: ... + +class _FromStringWorker(Generic[_LanguageT_co]): + language: _LanguageT_co + + original: str | None + quotes_map: dict[str, str] + + @overload + def __init__(self: _FromStringWorker[L[Language.C]], /, language: L[Language.C] = ...) -> None: ... + @overload + def __init__(self, /, language: _LanguageT_co) -> None: ... + + # + def finalize_string(self, /, s: str) -> str: ... + + # + def parse(self, /, inp: str) -> Expr | _Pair: ... + + # + @overload + def process(self, /, s: str, context: str = "expr") -> Expr | _Pair: ... + @overload + def process(self, /, s: list[str], context: str = "expr") -> list[Expr | _Pair]: ... + @overload + def process(self, /, s: tuple[str, ...], context: str = "expr") -> tuple[Expr | _Pair, ...]: ... + @overload + def process(self, /, s: _NestedString, context: str = "expr") -> Any: ... diff --git a/tool/allowlists/common-todo.txt b/tool/allowlists/common-todo.txt index f5096372..859fa248 100644 --- a/tool/allowlists/common-todo.txt +++ b/tool/allowlists/common-todo.txt @@ -11,5 +11,8 @@ numpy(\..+)?\.complexfloating.__complex__ # https://github.com/numpy/numtype/issues/40 numpy.f2py.__main__ numpy.f2py.crackfortran -numpy.f2py.symbolic -numpy.f2py.((cb|common|f90mod|use)_)?rules +numpy.f2py.rules +numpy.f2py.cb_rules +numpy.f2py.common_rules +numpy.f2py.f90mod_rules +numpy.f2py.use_rules From 825cc9b512a5854d26305b0f323c570e2ffbd37d Mon Sep 17 00:00:00 2001 From: jorenham Date: Fri, 7 Mar 2025 20:31:37 +0100 Subject: [PATCH 10/23] =?UTF-8?q?=F0=9F=A9=B9=20broaden=20callalble=20retu?= =?UTF-8?q?rn=20type?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/f2py/auxfuncs.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/numpy-stubs/f2py/auxfuncs.pyi b/src/numpy-stubs/f2py/auxfuncs.pyi index 9de0b107..fb91fb4c 100644 --- a/src/numpy-stubs/f2py/auxfuncs.pyi +++ b/src/numpy-stubs/f2py/auxfuncs.pyi @@ -130,7 +130,7 @@ _Intent: TypeAlias = L[ ### -isintent_dict: dict[Callable[[_Var], bool], _Intent] +isintent_dict: dict[Callable[[_Var], _Bool], _Intent] class F2PYError(Exception): ... From eefe3911023f6515a822affdd9d4a90c404feb84 Mon Sep 17 00:00:00 2001 From: jorenham Date: Fri, 7 Mar 2025 20:35:44 +0100 Subject: [PATCH 11/23] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20stub=20`numpy.f2p?= =?UTF-8?q?y.rules`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/f2py/rules.pyi | 41 +++++++++++++++++++++++++++++++++ tool/allowlists/common-todo.txt | 1 - 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 src/numpy-stubs/f2py/rules.pyi diff --git a/src/numpy-stubs/f2py/rules.pyi b/src/numpy-stubs/f2py/rules.pyi new file mode 100644 index 00000000..30439f6b --- /dev/null +++ b/src/numpy-stubs/f2py/rules.pyi @@ -0,0 +1,41 @@ +from collections.abc import Callable, Iterable, Mapping +from typing import Any, Final, Literal as L, TypeAlias +from typing_extensions import TypeVar + +from .__version__ import version +from .auxfuncs import _Bool, _Var + +### + +_VT = TypeVar("_VT", default=str) + +_Predicate: TypeAlias = Callable[[_Var], _Bool] +_RuleDict: TypeAlias = dict[str, _VT] +_DefDict: TypeAlias = dict[_Predicate, _VT] + +### + +f2py_version: Final = version +numpy_version: Final = version + +options: Final[dict[str, bool]] = ... +sepdict: Final[dict[str, str]] = ... + +generationtime: Final[int] = ... +typedef_need_dict: Final[_DefDict[str]] = ... + +module_rules: Final[_RuleDict[str | list[str] | _RuleDict]] = ... +routine_rules: Final[_RuleDict[str | list[str] | _DefDict | _RuleDict]] = ... +defmod_rules: Final[list[_RuleDict[str | _DefDict]]] = ... +rout_rules: Final[list[_RuleDict[str | Any]]] = ... +aux_rules: Final[list[_RuleDict[str | Any]]] = ... +arg_rules: Final[list[_RuleDict[str | Any]]] = ... +check_rules: Final[list[_RuleDict[str | Any]]] = ... + +stnd: Final[dict[L[1, 2, 3, 4, 5, 6, 7, 8, 9, 0], L["st", "nd", "rd", "th"]]] = ... + +def buildmodule(m: Mapping[str, str | Any], um: Iterable[Mapping[str, str | Any]]) -> _RuleDict: ... +def buildapi(rout: Mapping[str, str]) -> tuple[_RuleDict, str]: ... + +# namespace pollution +k: str diff --git a/tool/allowlists/common-todo.txt b/tool/allowlists/common-todo.txt index 859fa248..0676e460 100644 --- a/tool/allowlists/common-todo.txt +++ b/tool/allowlists/common-todo.txt @@ -11,7 +11,6 @@ numpy(\..+)?\.complexfloating.__complex__ # https://github.com/numpy/numtype/issues/40 numpy.f2py.__main__ numpy.f2py.crackfortran -numpy.f2py.rules numpy.f2py.cb_rules numpy.f2py.common_rules numpy.f2py.f90mod_rules From b75be6efac9cd3ae182d3579ff04a16e221d8697 Mon Sep 17 00:00:00 2001 From: jorenham Date: Fri, 7 Mar 2025 20:45:01 +0100 Subject: [PATCH 12/23] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20stub=20`numpy.f2p?= =?UTF-8?q?y.use=5Frules`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/f2py/use_rules.pyi | 10 ++++++++++ tool/allowlists/common-todo.txt | 1 - 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 src/numpy-stubs/f2py/use_rules.pyi diff --git a/src/numpy-stubs/f2py/use_rules.pyi b/src/numpy-stubs/f2py/use_rules.pyi new file mode 100644 index 00000000..4ba4b1f6 --- /dev/null +++ b/src/numpy-stubs/f2py/use_rules.pyi @@ -0,0 +1,10 @@ +from _typeshed import Incomplete +from collections.abc import Mapping +from typing import Final + +__version__: Final[str] = ... +f2py_version: Final = "See `f2py -v`" +usemodule_rules: Final[dict[str, str | list[str]]] = ... + +def buildusevars(m: Mapping[str, Incomplete], r: Mapping[str, Mapping[str, Incomplete]]) -> dict[str, Incomplete]: ... +def buildusevar(name: str, realname: str, vars: Mapping[str, Mapping[str, str]], usemodulename: str) -> dict[str, Incomplete]: ... diff --git a/tool/allowlists/common-todo.txt b/tool/allowlists/common-todo.txt index 0676e460..f03e89af 100644 --- a/tool/allowlists/common-todo.txt +++ b/tool/allowlists/common-todo.txt @@ -14,4 +14,3 @@ numpy.f2py.crackfortran numpy.f2py.cb_rules numpy.f2py.common_rules numpy.f2py.f90mod_rules -numpy.f2py.use_rules From d653e8cfb237efaf331d1ccf22d82bfe5128183f Mon Sep 17 00:00:00 2001 From: jorenham Date: Fri, 7 Mar 2025 20:48:44 +0100 Subject: [PATCH 13/23] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20stub=20`numpy.f2p?= =?UTF-8?q?y.f90mod=5Frules`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/f2py/f90mod_rules.pyi | 17 +++++++++++++++++ tool/allowlists/common-todo.txt | 1 - 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 src/numpy-stubs/f2py/f90mod_rules.pyi diff --git a/src/numpy-stubs/f2py/f90mod_rules.pyi b/src/numpy-stubs/f2py/f90mod_rules.pyi new file mode 100644 index 00000000..24baf49c --- /dev/null +++ b/src/numpy-stubs/f2py/f90mod_rules.pyi @@ -0,0 +1,17 @@ +from _typeshed import Incomplete +from collections.abc import Mapping +from typing import Final + +from .auxfuncs import isintent_dict as isintent_dict + +__version__: Final[str] = ... +f2py_version: Final = "See `f2py -v`" + +options: Final[dict[str, bool]] + +fgetdims1: Final[str] = ... +fgetdims2: Final[str] = ... +fgetdims2_sa: Final[str] = ... + +def findf90modules(m: Mapping[str, Incomplete]) -> list[dict[str, Incomplete]]: ... +def buildhooks(pymod: Mapping[str, Incomplete]) -> dict[str, Incomplete]: ... diff --git a/tool/allowlists/common-todo.txt b/tool/allowlists/common-todo.txt index f03e89af..201aec13 100644 --- a/tool/allowlists/common-todo.txt +++ b/tool/allowlists/common-todo.txt @@ -13,4 +13,3 @@ numpy.f2py.__main__ numpy.f2py.crackfortran numpy.f2py.cb_rules numpy.f2py.common_rules -numpy.f2py.f90mod_rules From 14c5012ce07804244f1b41c6eb929cc0fed02908 Mon Sep 17 00:00:00 2001 From: jorenham Date: Fri, 7 Mar 2025 20:55:43 +0100 Subject: [PATCH 14/23] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20stub=20`numpy.f2p?= =?UTF-8?q?y.common=5Frules`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/f2py/common_rules.pyi | 10 ++++++++++ tool/allowlists/common-todo.txt | 1 - 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 src/numpy-stubs/f2py/common_rules.pyi diff --git a/src/numpy-stubs/f2py/common_rules.pyi b/src/numpy-stubs/f2py/common_rules.pyi new file mode 100644 index 00000000..c62a3f9f --- /dev/null +++ b/src/numpy-stubs/f2py/common_rules.pyi @@ -0,0 +1,10 @@ +from _typeshed import Incomplete +from collections.abc import Mapping +from typing import Final + +from .__version__ import version + +f2py_version: Final = version + +def findcommonblocks(block: Mapping[str, Incomplete], top: int = 1) -> list[tuple[str, list[str], dict[str, Incomplete]]]: ... +def buildhooks(m: Mapping[str, Incomplete]) -> tuple[dict[str, Incomplete], str]: ... diff --git a/tool/allowlists/common-todo.txt b/tool/allowlists/common-todo.txt index 201aec13..de9a2fd5 100644 --- a/tool/allowlists/common-todo.txt +++ b/tool/allowlists/common-todo.txt @@ -12,4 +12,3 @@ numpy(\..+)?\.complexfloating.__complex__ numpy.f2py.__main__ numpy.f2py.crackfortran numpy.f2py.cb_rules -numpy.f2py.common_rules From b4c9b3cffa480d400df941651b94159551b45bc9 Mon Sep 17 00:00:00 2001 From: jorenham Date: Fri, 7 Mar 2025 21:01:21 +0100 Subject: [PATCH 15/23] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20stub=20`numpy.f2p?= =?UTF-8?q?y.cb=5Frules`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/f2py/cb_rules.pyi | 18 ++++++++++++++++++ tool/allowlists/common-todo.txt | 1 - 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 src/numpy-stubs/f2py/cb_rules.pyi diff --git a/src/numpy-stubs/f2py/cb_rules.pyi b/src/numpy-stubs/f2py/cb_rules.pyi new file mode 100644 index 00000000..0e0356f2 --- /dev/null +++ b/src/numpy-stubs/f2py/cb_rules.pyi @@ -0,0 +1,18 @@ +from _typeshed import Incomplete +from collections.abc import Mapping +from typing import Any, Final + +from .__version__ import version + +## + +f2py_version: Final = version + +cb_routine_rules: Final[dict[str, str | list[str]]] = ... +cb_rout_rules: Final[list[dict[str, str | Any]]] = ... +cb_arg_rules: Final[list[dict[str, str | Any]]] = ... + +cb_map: Final[dict[str, list[list[str]]]] = ... + +def buildcallbacks(m: Mapping[str, Incomplete]) -> None: ... +def buildcallback(rout: Mapping[str, Incomplete], um: Mapping[str, Incomplete]) -> None: ... diff --git a/tool/allowlists/common-todo.txt b/tool/allowlists/common-todo.txt index de9a2fd5..c22a1c7f 100644 --- a/tool/allowlists/common-todo.txt +++ b/tool/allowlists/common-todo.txt @@ -11,4 +11,3 @@ numpy(\..+)?\.complexfloating.__complex__ # https://github.com/numpy/numtype/issues/40 numpy.f2py.__main__ numpy.f2py.crackfortran -numpy.f2py.cb_rules From d572d89d2b2bc939197f548915888b21948d2659 Mon Sep 17 00:00:00 2001 From: jorenham Date: Sat, 8 Mar 2025 08:51:18 +0100 Subject: [PATCH 16/23] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20stub=20`numpy.f2p?= =?UTF-8?q?y.crackfortran`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/f2py/crackfortran.pyi | 268 ++++++++++++++++++++++++++ tool/allowlists/common-todo.txt | 1 - 2 files changed, 268 insertions(+), 1 deletion(-) create mode 100644 src/numpy-stubs/f2py/crackfortran.pyi diff --git a/src/numpy-stubs/f2py/crackfortran.pyi b/src/numpy-stubs/f2py/crackfortran.pyi new file mode 100644 index 00000000..cd90ee77 --- /dev/null +++ b/src/numpy-stubs/f2py/crackfortran.pyi @@ -0,0 +1,268 @@ +import re +from _typeshed import Incomplete, StrOrBytesPath, StrPath +from collections.abc import Callable, Iterable, Mapping +from typing import IO, Any, Concatenate, Final, Literal as L, Never, ParamSpec, TypeAlias, overload + +from .__version__ import version +from .auxfuncs import isintent_dict as isintent_dict + +### + +_Tss = ParamSpec("_Tss") + +_VisitResult: TypeAlias = list[Any] | dict[str, Any] | None +_VisitItem: TypeAlias = tuple[str | None, _VisitResult] +_VisitFunc: TypeAlias = Callable[Concatenate[_VisitItem, list[_VisitItem], _VisitResult, _Tss], _VisitItem | None] + +### + +COMMON_FREE_EXTENSIONS: Final[list[str]] = ... +COMMON_FIXED_EXTENSIONS: Final[list[str]] = ... + +f2py_version: Final = version +tabchar: Final[str] = " " + +f77modulename: str +pyffilename: str +sourcecodeform: L["fix", "gree"] +strictf77: L[0, 1] +quiet: L[0, 1] +verbose: L[0, 1, 2] +skipemptyends: L[0, 1] +ignorecontains: L[1] +dolowercase: L[1] + +beginpattern: str | re.Pattern[str] +currentfilename: str +filepositiontext: str +expectbegin: L[0, 1] +gotnextfile: L[0, 1] +neededmodule: int +skipblocksuntil: int +groupcounter: int +groupname: dict[int, str] | str +groupcache: dict[int, dict[str, Any]] | None +grouplist: dict[int, list[dict[str, Any]]] | None +previous_context: tuple[str, str, int] | None + +f90modulevars: dict[str, dict[str, Any]] = {} +debug: list[Never] = [] +include_paths: list[str] = [] +onlyfuncs: list[str] = [] +skipfuncs: list[str] = [] +skipfunctions: Final[list[str]] = [] +usermodules: Final[list[dict[str, Any]]] = [] + +defaultimplicitrules: Final[dict[str, dict[str, str]]] = {} +badnames: Final[dict[str, str]] = {} +invbadnames: Final[dict[str, str]] = {} + +beforethisafter: Final[str] = ... +fortrantypes: Final[str] = ... +groupbegins77: Final[str] = ... +groupbegins90: Final[str] = ... +groupends: Final[str] = ... +endifs: Final[str] = ... +moduleprocedures: Final[str] = ... + +beginpattern77: Final[tuple[re.Pattern[str], L["begin"]]] = ... +beginpattern90: Final[tuple[re.Pattern[str], L["begin"]]] = ... +callpattern: Final[tuple[re.Pattern[str], L["call"]]] = ... +callfunpattern: Final[tuple[re.Pattern[str], L["callfun"]]] = ... +commonpattern: Final[tuple[re.Pattern[str], L["common"]]] = ... +containspattern: Final[tuple[re.Pattern[str], L["contains"]]] = ... +datapattern: Final[tuple[re.Pattern[str], L["data"]]] = ... +dimensionpattern: Final[tuple[re.Pattern[str], L["dimension"]]] = ... +endifpattern: Final[tuple[re.Pattern[str], L["endif"]]] = ... +endpattern: Final[tuple[re.Pattern[str], L["end"]]] = ... +entrypattern: Final[tuple[re.Pattern[str], L["entry"]]] = ... +externalpattern: Final[tuple[re.Pattern[str], L["external"]]] = ... +f2pyenhancementspattern: Final[tuple[re.Pattern[str], L["f2pyenhancements"]]] = ... +formatpattern: Final[tuple[re.Pattern[str], L["format"]]] = ... +functionpattern: Final[tuple[re.Pattern[str], L["begin"]]] = ... +implicitpattern: Final[tuple[re.Pattern[str], L["implicit"]]] = ... +intentpattern: Final[tuple[re.Pattern[str], L["intent"]]] = ... +intrinsicpattern: Final[tuple[re.Pattern[str], L["intrinsic"]]] = ... +optionalpattern: Final[tuple[re.Pattern[str], L["optional"]]] = ... +moduleprocedurepattern: Final[tuple[re.Pattern[str], L["moduleprocedure"]]] = ... +multilinepattern: Final[tuple[re.Pattern[str], L["multiline"]]] = ... +parameterpattern: Final[tuple[re.Pattern[str], L["parameter"]]] = ... +privatepattern: Final[tuple[re.Pattern[str], L["private"]]] = ... +publicpattern: Final[tuple[re.Pattern[str], L["public"]]] = ... +requiredpattern: Final[tuple[re.Pattern[str], L["required"]]] = ... +subroutinepattern: Final[tuple[re.Pattern[str], L["begin"]]] = ... +typespattern: Final[tuple[re.Pattern[str], L["type"]]] = ... +usepattern: Final[tuple[re.Pattern[str], L["use"]]] = ... + +analyzeargs_re_1: Final[re.Pattern[str]] = ... +callnameargspattern: Final[re.Pattern[str]] = ... +charselector: Final[re.Pattern[str]] = ... +crackline_bind_1: Final[re.Pattern[str]] = ... +crackline_bindlang: Final[re.Pattern[str]] = ... +crackline_re_1: Final[re.Pattern[str]] = ... +determineexprtype_re_1: Final[re.Pattern[str]] = ... +determineexprtype_re_2: Final[re.Pattern[str]] = ... +determineexprtype_re_3: Final[re.Pattern[str]] = ... +determineexprtype_re_4: Final[re.Pattern[str]] = ... +determineexprtype_re_5: Final[re.Pattern[str]] = ... +getlincoef_re_1: Final[re.Pattern[str]] = ... +kindselector: Final[re.Pattern[str]] = ... +lenarraypattern: Final[re.Pattern[str]] = ... +lenkindpattern: Final[re.Pattern[str]] = ... +namepattern: Final[re.Pattern[str]] = ... +nameargspattern: Final[re.Pattern[str]] = ... +operatorpattern: Final[re.Pattern[str]] = ... +real16pattern: Final[re.Pattern[str]] = ... +real8pattern: Final[re.Pattern[str]] = ... +selectpattern: Final[re.Pattern[str]] = ... +typedefpattern: Final[re.Pattern[str]] = ... +typespattern4implicit: Final[re.Pattern[str]] = ... +word_pattern: Final[re.Pattern[str]] = ... + +post_processing_hooks: Final[list[_VisitFunc[...]]] = [] + +# +def outmess(line: str, flag: int = 1) -> None: ... +def reset_global_f2py_vars() -> None: ... + +# +def rmbadname1(name: str) -> str: ... +def undo_rmbadname1(name: str) -> str: ... +def rmbadname(names: Iterable[str]) -> list[str]: ... +def undo_rmbadname(names: Iterable[str]) -> list[str]: ... + +# +def openhook(filename: StrPath, mode: str) -> IO[Any]: ... +def is_free_format(fname: StrPath) -> bool: ... +def readfortrancode( + ffile: StrOrBytesPath | Iterable[StrOrBytesPath], + dowithline: Callable[[str, int], object] = ..., + istop: int = 1, +) -> None: ... + +# +def split_by_unquoted(line: str, characters: str) -> tuple[str, str]: ... + +# +def crackline(line: str, reset: int = 0) -> None: ... +def markouterparen(line: str) -> str: ... +def markoutercomma(line: str, comma: str = ",") -> str: ... +def unmarkouterparen(line: str) -> str: ... +def appenddecl( + decl: Mapping[str, Incomplete] | None, + decl2: Mapping[str, Incomplete] | None, + force: int = 1, +) -> dict[str, Incomplete]: ... + +# +def parse_name_for_bind(line: str) -> tuple[str, str | None]: ... +def analyzeline(m: re.Match[str], case: str, line: str) -> None: ... +def appendmultiline(group: dict[str, Incomplete], context_name: str, ml: str) -> None: ... +def cracktypespec0(typespec: str, ll: str | None) -> tuple[str, str | None, str | None, str | None]: ... + +# +def removespaces(expr: str) -> str: ... +def markinnerspaces(line: str) -> str: ... +def updatevars(typespec: str, selector: str | None, attrspec: str, entitydecl: str) -> str: ... +def cracktypespec(typespec: str, selector: str | None) -> tuple[dict[str, str] | None, dict[str, str] | None, str | None]: ... + +# +def setattrspec(decl: dict[str, list[str]], attr: str | None, force: int = 0) -> dict[str, list[str]]: ... +def setkindselector(decl: dict[str, dict[str, str]], sel: dict[str, str], force: int = 0) -> dict[str, dict[str, str]]: ... +def setcharselector(decl: dict[str, dict[str, str]], sel: dict[str, str], force: int = 0) -> dict[str, dict[str, str]]: ... +def getblockname(block: Mapping[str, Any], unknown: str = "unknown") -> str: ... +def setmesstext(block: Mapping[str, Any]) -> None: ... +def get_usedict(block: Mapping[str, Any]) -> dict[str, str]: ... +def get_useparameters(block: Mapping[str, Any], param_map: Mapping[str, str] | None = None) -> dict[str, str]: ... + +# +@overload +def postcrack2( + block: dict[str, Any], + tab: str = "", + param_map: Mapping[str, str] | None = None, +) -> dict[str, str | Incomplete]: ... +@overload +def postcrack2( + block: list[dict[str, Any]], + tab: str = "", + param_map: Mapping[str, str] | None = None, +) -> list[dict[str, str | Incomplete]]: ... + +# +@overload +def postcrack( + block: dict[str, Any], + args: Mapping[str, str] | None = None, + tab: str = "", +) -> dict[str, Incomplete]: ... +@overload +def postcrack( + block: list[dict[str, str]], + args: Mapping[str, str] | None = None, + tab: str = "", +) -> list[dict[str, Incomplete]]: ... + +# +def sortvarnames(vars: Mapping[str, Any]) -> list[str]: ... +def analyzecommon(block: Mapping[str, Any]) -> dict[str, Incomplete]: ... +def analyzebody(block: Mapping[str, Any], args: Mapping[str, str], tab: str = "") -> list[dict[str, Incomplete]]: ... +def buildimplicitrules(block: Mapping[str, Any]) -> tuple[dict[str, dict[str, str]], dict[str, str]]: ... +def myeval(e: str, g: Incomplete | None = None, l: Incomplete | None = None) -> float: ... + +# +def getlincoef(e: str, xset: set[str]) -> tuple[float | None, float | None, str | None]: ... + +# +def get_sorted_names(vars: Mapping[str, Mapping[str, str]]) -> list[str]: ... +def get_parameters(vars: Mapping[str, Mapping[str, str]], global_params: dict[str, str] = {}) -> dict[str, str]: ... + +# +def analyzevars(block: Mapping[str, Any]) -> dict[str, dict[str, str]]: ... + +# +def param_eval(v: str, g_params: dict[str, Any], params: Mapping[str, Any], dimspec: str | None = None) -> dict[str, Any]: ... +def param_parse(d: str, params: Mapping[str, str]) -> str: ... +def expr2name(a: str, block: Mapping[str, Any], args: list[str] = []) -> str: ... +def analyzeargs(block: Mapping[str, Any]) -> dict[str, Any]: ... + +# +def determineexprtype(expr: str, vars: Mapping[str, Any], rules: dict[str, Any] = {}) -> dict[str, Any]: ... +def crack2fortrangen(block: Mapping[str, Any], tab: str = "\n", as_interface: bool = False) -> str: ... +def common2fortran(common: Mapping[str, Any], tab: str = "") -> str: ... +def use2fortran(use: Mapping[str, Any], tab: str = "") -> str: ... +def true_intent_list(var: dict[str, list[str]]) -> list[str]: ... +def vars2fortran( + block: Mapping[str, Mapping[str, Any]], + vars: Mapping[str, Any], + args: Mapping[str, str], + tab: str = "", + as_interface: bool = False, +) -> str: ... + +# +def crackfortran(files: StrOrBytesPath | Iterable[StrOrBytesPath]) -> list[dict[str, Any]]: ... +def crack2fortran(block: Mapping[str, Any]) -> str: ... + +# +def traverse( + obj: tuple[str | None, _VisitResult], + visit: _VisitFunc[_Tss], + parents: list[tuple[str | None, _VisitResult]] = [], + result: list[Any] | dict[str, Any] | None = None, + *args: _Tss.args, + **kwargs: _Tss.kwargs, +) -> _VisitItem | _VisitResult: ... + +# +def character_backward_compatibility_hook( + item: _VisitItem, + parents: list[_VisitItem], + result: object, # ignored + *args: object, # ignored + **kwargs: object, # ignored +) -> _VisitItem | None: ... + +# namespace pollution +c: str +n: str diff --git a/tool/allowlists/common-todo.txt b/tool/allowlists/common-todo.txt index c22a1c7f..f0321c00 100644 --- a/tool/allowlists/common-todo.txt +++ b/tool/allowlists/common-todo.txt @@ -10,4 +10,3 @@ numpy(\..+)?\.complexfloating.__complex__ # https://github.com/numpy/numtype/issues/40 numpy.f2py.__main__ -numpy.f2py.crackfortran From 6647cb4a9f7c6f1afa069b38f1ca34eee474cc86 Mon Sep 17 00:00:00 2001 From: jorenham Date: Sat, 8 Mar 2025 08:58:52 +0100 Subject: [PATCH 17/23] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20stub=20`numpy.f2p?= =?UTF-8?q?y.=5Fsrc=5Fpyf`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/f2py/_src_pyf.pyi | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/numpy-stubs/f2py/_src_pyf.pyi diff --git a/src/numpy-stubs/f2py/_src_pyf.pyi b/src/numpy-stubs/f2py/_src_pyf.pyi new file mode 100644 index 00000000..50ddd07b --- /dev/null +++ b/src/numpy-stubs/f2py/_src_pyf.pyi @@ -0,0 +1,28 @@ +import re +from _typeshed import StrOrBytesPath +from collections.abc import Mapping +from typing import Final + +routine_start_re: Final[re.Pattern[str]] = ... +routine_end_re: Final[re.Pattern[str]] = ... +function_start_re: Final[re.Pattern[str]] = ... +template_re: Final[re.Pattern[str]] = ... +named_re: Final[re.Pattern[str]] = ... +list_re: Final[re.Pattern[str]] = ... +item_re: Final[re.Pattern[str]] = ... +template_name_re: Final[re.Pattern[str]] = ... +include_src_re: Final[re.Pattern[str]] = ... + +def parse_structure(astr: str) -> list[tuple[int, int]]: ... +def find_repl_patterns(astr: str) -> dict[str, str]: ... +def find_and_remove_repl_patterns(astr: str) -> tuple[str, dict[str, str]]: ... +def conv(astr: str) -> str: ... + +# +def unique_key(adict: Mapping[str, object]) -> str: ... +def expand_sub(substr: str, names: dict[str, str]) -> str: ... +def process_str(allstr: str) -> str: ... + +# +def resolve_includes(source: StrOrBytesPath) -> list[str]: ... +def process_file(source: StrOrBytesPath) -> str: ... From e693b840b100f4d1263571360c90a0afa1638df8 Mon Sep 17 00:00:00 2001 From: jorenham Date: Sat, 8 Mar 2025 09:01:38 +0100 Subject: [PATCH 18/23] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20stub=20`numpy.f2p?= =?UTF-8?q?y.=5Fisocbind`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/f2py/_isocbind.pyi | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/numpy-stubs/f2py/_isocbind.pyi diff --git a/src/numpy-stubs/f2py/_isocbind.pyi b/src/numpy-stubs/f2py/_isocbind.pyi new file mode 100644 index 00000000..b972f560 --- /dev/null +++ b/src/numpy-stubs/f2py/_isocbind.pyi @@ -0,0 +1,13 @@ +from typing import Any, Final + +iso_c_binding_map: Final[dict[str, dict[str, str]]] = ... + +isoc_c2pycode_map: Final[dict[str, Any]] = {} # not implemented +iso_c2py_map: Final[dict[str, Any]] = {} # not implemented + +isoc_kindmap: Final[dict[str, str]] = ... + +# namespace pollution +c_type: str +c_type_dict: dict[str, str] +fortran_type: str From 3f44b76d0d6cf412797b95ce96b99d04df53d6e3 Mon Sep 17 00:00:00 2001 From: jorenham Date: Sat, 8 Mar 2025 09:19:05 +0100 Subject: [PATCH 19/23] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20stub=20`numpy.f2p?= =?UTF-8?q?y.=5Fbackends.*`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/f2py/_backends/__init__.pyi | 5 ++ src/numpy-stubs/f2py/_backends/_backend.pyi | 44 ++++++++++++++ src/numpy-stubs/f2py/_backends/_distutils.pyi | 11 ++++ src/numpy-stubs/f2py/_backends/_meson.pyi | 60 +++++++++++++++++++ 4 files changed, 120 insertions(+) create mode 100644 src/numpy-stubs/f2py/_backends/__init__.pyi create mode 100644 src/numpy-stubs/f2py/_backends/_backend.pyi create mode 100644 src/numpy-stubs/f2py/_backends/_distutils.pyi create mode 100644 src/numpy-stubs/f2py/_backends/_meson.pyi diff --git a/src/numpy-stubs/f2py/_backends/__init__.pyi b/src/numpy-stubs/f2py/_backends/__init__.pyi new file mode 100644 index 00000000..43625c68 --- /dev/null +++ b/src/numpy-stubs/f2py/_backends/__init__.pyi @@ -0,0 +1,5 @@ +from typing import Literal as L + +from ._backend import Backend + +def f2py_build_generator(name: L["distutils", "meson"]) -> Backend: ... diff --git a/src/numpy-stubs/f2py/_backends/_backend.pyi b/src/numpy-stubs/f2py/_backends/_backend.pyi new file mode 100644 index 00000000..d14565ca --- /dev/null +++ b/src/numpy-stubs/f2py/_backends/_backend.pyi @@ -0,0 +1,44 @@ +import abc +from _typeshed import Incomplete +from typing import Any + +class Backend(abc.ABC): + modulename: str + sources: list[str] + extra_objects: Incomplete + build_dir: Incomplete + include_dirs: Incomplete + library_dirs: Incomplete + libraries: Incomplete + define_macros: Incomplete + undef_macros: Incomplete + f2py_flags: Incomplete + sysinfo_flags: Incomplete + fc_flags: Incomplete + flib_flags: Incomplete + setup_flags: Incomplete + remove_build_dir: Incomplete + extra_dat: dict[str, Any] + + def __init__( + self, + /, + modulename: str, + sources: list[str], + extra_objects: Incomplete, + build_dir: Incomplete, + include_dirs: Incomplete, + library_dirs: Incomplete, + libraries: list[str], + define_macros: Incomplete, + undef_macros: Incomplete, + f2py_flags: Incomplete, + sysinfo_flags: Incomplete, + fc_flags: Incomplete, + flib_flags: Incomplete, + setup_flags: Incomplete, + remove_build_dir: Incomplete, + extra_dat: Incomplete, + ) -> None: ... + @abc.abstractmethod + def compile(self) -> None: ... diff --git a/src/numpy-stubs/f2py/_backends/_distutils.pyi b/src/numpy-stubs/f2py/_backends/_distutils.pyi new file mode 100644 index 00000000..189996ba --- /dev/null +++ b/src/numpy-stubs/f2py/_backends/_distutils.pyi @@ -0,0 +1,11 @@ +from typing_extensions import deprecated + +from ._backend import Backend + +class DistutilsBackend(Backend): + @deprecated( + "distutils has been deprecated since NumPy 1.26.x. Use the Meson backend instead, or generate wrappers without -c and " + "use a custom build script" + ) + def __init__(sef, /, *args: object, **kwargs: object) -> None: ... + def compile(self) -> None: ... diff --git a/src/numpy-stubs/f2py/_backends/_meson.pyi b/src/numpy-stubs/f2py/_backends/_meson.pyi new file mode 100644 index 00000000..30d97520 --- /dev/null +++ b/src/numpy-stubs/f2py/_backends/_meson.pyi @@ -0,0 +1,60 @@ +from collections.abc import Callable +from pathlib import Path +from typing import Final + +from ._backend import Backend + +class MesonTemplate: + modulename: Final[str] + build_template_path: Final[Path] + sources: Final[list[Path]] + deps: Final[list[str]] + libraries: Final[list[str]] + library_dirs: Final[list[Path]] + include_dirs: Final[list[Path]] + substitutions: Final[dict[str, str]] + objects: Final[list[Path]] + fortran_args: Final[list[str]] + pipeline: Final[list[Callable[[], None]]] + build_type: Final[str] + python_exe: Final[str] + indent: Final[str] + + def __init__( + self, + /, + modulename: str, + sources: list[Path], + deps: list[str], + libraries: list[str], + library_dirs: list[Path], + include_dirs: list[Path], + object_files: list[Path], + linker_args: list[str], + fortran_args: list[str], + build_type: str, + python_exe: str, + ) -> None: ... + + # + def initialize_template(self) -> None: ... + def sources_substitution(self) -> None: ... + def deps_substitution(self) -> None: ... + def libraries_substitution(self) -> None: ... + def include_substitution(self) -> None: ... + def fortran_args_substitution(self) -> None: ... + + # + def meson_build_template(self) -> str: ... + def generate_meson_build(self) -> str: ... + +class MesonBackend(Backend): + dependencies: list[str] + meson_build_dir: str + build_type: str + fc_flags: list[str] + + def __init__(self, /, *args: object, **kwargs: object) -> None: ... + def write_meson_build(self, /, build_dir: Path) -> None: ... + def run_meson(self, /, build_dir: Path) -> None: ... + def compile(self) -> None: ... From 4539f5d7468e6bed4ab55371bf3472d6fff86fd7 Mon Sep 17 00:00:00 2001 From: jorenham Date: Sat, 8 Mar 2025 09:25:41 +0100 Subject: [PATCH 20/23] =?UTF-8?q?=F0=9F=A9=B9=20fix=20`typing=5Fextensions?= =?UTF-8?q?`=20imports?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/f2py/auxfuncs.pyi | 4 ++-- src/numpy-stubs/f2py/crackfortran.pyi | 3 ++- src/numpy-stubs/f2py/f2py2e.pyi | 4 ++-- src/numpy-stubs/f2py/symbolic.pyi | 4 ++-- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/numpy-stubs/f2py/auxfuncs.pyi b/src/numpy-stubs/f2py/auxfuncs.pyi index fb91fb4c..b6e09597 100644 --- a/src/numpy-stubs/f2py/auxfuncs.pyi +++ b/src/numpy-stubs/f2py/auxfuncs.pyi @@ -1,8 +1,8 @@ from _typeshed import FileDescriptorOrPath, Incomplete from collections.abc import Callable, Mapping from pprint import pprint as show -from typing import Final, Literal as L, Never, TypeAlias, overload -from typing_extensions import TypeVar +from typing import Final, Literal as L, TypeAlias, overload +from typing_extensions import Never, TypeVar from .cfuncs import errmess diff --git a/src/numpy-stubs/f2py/crackfortran.pyi b/src/numpy-stubs/f2py/crackfortran.pyi index cd90ee77..e7fc26fb 100644 --- a/src/numpy-stubs/f2py/crackfortran.pyi +++ b/src/numpy-stubs/f2py/crackfortran.pyi @@ -1,7 +1,8 @@ import re from _typeshed import Incomplete, StrOrBytesPath, StrPath from collections.abc import Callable, Iterable, Mapping -from typing import IO, Any, Concatenate, Final, Literal as L, Never, ParamSpec, TypeAlias, overload +from typing import IO, Any, Concatenate, Final, Literal as L, ParamSpec, TypeAlias, overload +from typing_extensions import Never from .__version__ import version from .auxfuncs import isintent_dict as isintent_dict diff --git a/src/numpy-stubs/f2py/f2py2e.pyi b/src/numpy-stubs/f2py/f2py2e.pyi index b1b403b5..2a563d51 100644 --- a/src/numpy-stubs/f2py/f2py2e.pyi +++ b/src/numpy-stubs/f2py/f2py2e.pyi @@ -3,8 +3,8 @@ import pprint from _typeshed import Incomplete from collections.abc import Hashable, Iterable, Mapping, MutableMapping, Sequence from types import ModuleType -from typing import Final, NotRequired, TypedDict, type_check_only -from typing_extensions import TypeVar +from typing import Final, TypedDict, type_check_only +from typing_extensions import NotRequired, TypeVar from .__version__ import version from .auxfuncs import _Bool, outmess as outmess diff --git a/src/numpy-stubs/f2py/symbolic.pyi b/src/numpy-stubs/f2py/symbolic.pyi index 24d584e9..d638b1c1 100644 --- a/src/numpy-stubs/f2py/symbolic.pyi +++ b/src/numpy-stubs/f2py/symbolic.pyi @@ -1,7 +1,7 @@ from collections.abc import Callable, Mapping from enum import Enum -from typing import Any, Generic, Literal as L, ParamSpec, Self, TypeAlias, overload -from typing_extensions import TypeVar +from typing import Any, Generic, Literal as L, ParamSpec, TypeAlias, overload +from typing_extensions import Self, TypeVar __all__ = ["Expr"] From 01ee5e5a60a2b585c87e8d38a7f3a8108b2032d0 Mon Sep 17 00:00:00 2001 From: jorenham Date: Sat, 8 Mar 2025 09:32:46 +0100 Subject: [PATCH 21/23] =?UTF-8?q?=F0=9F=99=88=20ignore=20non-existent=20`n?= =?UTF-8?q?umpy.f2py`=20submodules?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tool/allowlists/common-todo.txt | 3 --- tool/allowlists/common.txt | 3 +++ tool/allowlists/ge-py312.txt | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/tool/allowlists/common-todo.txt b/tool/allowlists/common-todo.txt index f0321c00..1ce26b28 100644 --- a/tool/allowlists/common-todo.txt +++ b/tool/allowlists/common-todo.txt @@ -7,6 +7,3 @@ numpy(\..+)?\.floating.is_integer numpy(\..+)?\.floating.as_integer_ratio numpy(\..+)?\.complexfloating.__hash__ numpy(\..+)?\.complexfloating.__complex__ - -# https://github.com/numpy/numtype/issues/40 -numpy.f2py.__main__ diff --git a/tool/allowlists/common.txt b/tool/allowlists/common.txt index 083357a5..bbef4633 100644 --- a/tool/allowlists/common.txt +++ b/tool/allowlists/common.txt @@ -27,6 +27,9 @@ numpy\._core\.cversions # mypy plugin numpy\.typing\.mypy_plugin +# raises SystemExit on import +numpy\.f2py\.__main__ + # workaround for https://github.com/python/mypy/issues/15302#issuecomment-2701979355 numpy\.testing(\._private\.utils)?\.check_support_sve diff --git a/tool/allowlists/ge-py312.txt b/tool/allowlists/ge-py312.txt index 73d46468..a8d8a8ed 100644 --- a/tool/allowlists/ge-py312.txt +++ b/tool/allowlists/ge-py312.txt @@ -1,3 +1,4 @@ # python >= 3.12 numpy\.distutils +numpy\.f2py\._backends\._distutils From 562e6e9f2ac4ec273b02c0edf21879301d995055 Mon Sep 17 00:00:00 2001 From: jorenham Date: Sat, 8 Mar 2025 09:33:24 +0100 Subject: [PATCH 22/23] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20bow=20down=20to=20th?= =?UTF-8?q?e=20`self`=20->=20`sef`=20typo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/f2py/_backends/_distutils.pyi | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/numpy-stubs/f2py/_backends/_distutils.pyi b/src/numpy-stubs/f2py/_backends/_distutils.pyi index 189996ba..9ae2cb7d 100644 --- a/src/numpy-stubs/f2py/_backends/_distutils.pyi +++ b/src/numpy-stubs/f2py/_backends/_distutils.pyi @@ -7,5 +7,6 @@ class DistutilsBackend(Backend): "distutils has been deprecated since NumPy 1.26.x. Use the Meson backend instead, or generate wrappers without -c and " "use a custom build script" ) - def __init__(sef, /, *args: object, **kwargs: object) -> None: ... + # NOTE: the `sef` typo matches runtime + def __init__(sef, *args: object, **kwargs: object) -> None: ... def compile(self) -> None: ... From 3eeb74bdf42802adfdf704e48eed99cc197d6b02 Mon Sep 17 00:00:00 2001 From: jorenham Date: Mon, 10 Mar 2025 14:03:04 +0100 Subject: [PATCH 23/23] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20fill=20in=20the?= =?UTF-8?q?=20remaining=20`Incomplete`=20in=20`numpy.f2py`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/numpy-stubs/f2py/_backends/_backend.pyi | 66 +++++++++++---------- src/numpy-stubs/f2py/_backends/_meson.pyi | 21 ++++--- src/numpy-stubs/f2py/auxfuncs.pyi | 13 ++-- src/numpy-stubs/f2py/cb_rules.pyi | 5 +- src/numpy-stubs/f2py/common_rules.pyi | 7 +-- src/numpy-stubs/f2py/crackfortran.pyi | 62 ++++++++----------- src/numpy-stubs/f2py/f2py2e.pyi | 9 ++- src/numpy-stubs/f2py/f90mod_rules.pyi | 7 +-- src/numpy-stubs/f2py/use_rules.pyi | 7 +-- 9 files changed, 89 insertions(+), 108 deletions(-) diff --git a/src/numpy-stubs/f2py/_backends/_backend.pyi b/src/numpy-stubs/f2py/_backends/_backend.pyi index d14565ca..ed24519a 100644 --- a/src/numpy-stubs/f2py/_backends/_backend.pyi +++ b/src/numpy-stubs/f2py/_backends/_backend.pyi @@ -1,44 +1,46 @@ import abc -from _typeshed import Incomplete -from typing import Any +from pathlib import Path +from typing import Any, Final class Backend(abc.ABC): - modulename: str - sources: list[str] - extra_objects: Incomplete - build_dir: Incomplete - include_dirs: Incomplete - library_dirs: Incomplete - libraries: Incomplete - define_macros: Incomplete - undef_macros: Incomplete - f2py_flags: Incomplete - sysinfo_flags: Incomplete - fc_flags: Incomplete - flib_flags: Incomplete - setup_flags: Incomplete - remove_build_dir: Incomplete - extra_dat: dict[str, Any] + modulename: Final[str] + sources: Final[list[str | Path]] + extra_objects: Final[list[str]] + build_dir: Final[str | Path] + include_dirs: Final[list[str | Path]] + library_dirs: Final[list[str | Path]] + libraries: Final[list[str]] + define_macros: Final[list[tuple[str, str | None]]] + undef_macros: Final[list[str]] + f2py_flags: Final[list[str]] + sysinfo_flags: Final[list[str]] + fc_flags: Final[list[str]] + flib_flags: Final[list[str]] + setup_flags: Final[list[str]] + remove_build_dir: Final[bool] + extra_dat: Final[dict[str, Any]] def __init__( self, /, modulename: str, - sources: list[str], - extra_objects: Incomplete, - build_dir: Incomplete, - include_dirs: Incomplete, - library_dirs: Incomplete, + sources: list[str | Path], + extra_objects: list[str], + build_dir: str | Path, + include_dirs: list[str | Path], + library_dirs: list[str | Path], libraries: list[str], - define_macros: Incomplete, - undef_macros: Incomplete, - f2py_flags: Incomplete, - sysinfo_flags: Incomplete, - fc_flags: Incomplete, - flib_flags: Incomplete, - setup_flags: Incomplete, - remove_build_dir: Incomplete, - extra_dat: Incomplete, + define_macros: list[tuple[str, str | None]], + undef_macros: list[str], + f2py_flags: list[str], + sysinfo_flags: list[str], + fc_flags: list[str], + flib_flags: list[str], + setup_flags: list[str], + remove_build_dir: bool, + extra_dat: dict[str, Any], ) -> None: ... + + # @abc.abstractmethod def compile(self) -> None: ... diff --git a/src/numpy-stubs/f2py/_backends/_meson.pyi b/src/numpy-stubs/f2py/_backends/_meson.pyi index 30d97520..81731701 100644 --- a/src/numpy-stubs/f2py/_backends/_meson.pyi +++ b/src/numpy-stubs/f2py/_backends/_meson.pyi @@ -1,19 +1,19 @@ from collections.abc import Callable from pathlib import Path -from typing import Final +from typing import Final, Literal as L from ._backend import Backend class MesonTemplate: modulename: Final[str] build_template_path: Final[Path] - sources: Final[list[Path]] + sources: Final[list[str | Path]] deps: Final[list[str]] libraries: Final[list[str]] - library_dirs: Final[list[Path]] - include_dirs: Final[list[Path]] + library_dirs: Final[list[str | Path]] + include_dirs: Final[list[str | Path]] substitutions: Final[dict[str, str]] - objects: Final[list[Path]] + objects: Final[list[str | Path]] fortran_args: Final[list[str]] pipeline: Final[list[Callable[[], None]]] build_type: Final[str] @@ -27,9 +27,9 @@ class MesonTemplate: sources: list[Path], deps: list[str], libraries: list[str], - library_dirs: list[Path], - include_dirs: list[Path], - object_files: list[Path], + library_dirs: list[str | Path], + include_dirs: list[str | Path], + object_files: list[str | Path], linker_args: list[str], fortran_args: list[str], build_type: str, @@ -50,9 +50,8 @@ class MesonTemplate: class MesonBackend(Backend): dependencies: list[str] - meson_build_dir: str - build_type: str - fc_flags: list[str] + meson_build_dir: L["bdir"] + build_type: L["debug", "release"] def __init__(self, /, *args: object, **kwargs: object) -> None: ... def write_meson_build(self, /, build_dir: Path) -> None: ... diff --git a/src/numpy-stubs/f2py/auxfuncs.pyi b/src/numpy-stubs/f2py/auxfuncs.pyi index b6e09597..5de43624 100644 --- a/src/numpy-stubs/f2py/auxfuncs.pyi +++ b/src/numpy-stubs/f2py/auxfuncs.pyi @@ -1,7 +1,7 @@ -from _typeshed import FileDescriptorOrPath, Incomplete +from _typeshed import FileDescriptorOrPath from collections.abc import Callable, Mapping from pprint import pprint as show -from typing import Final, Literal as L, TypeAlias, overload +from typing import Any, Final, Literal as L, TypeAlias, overload from typing_extensions import Never, TypeVar from .cfuncs import errmess @@ -223,7 +223,7 @@ def isdummyroutine(rout: _ROut) -> _Bool: ... def iscstyledirective(f2py_line: str) -> bool: ... # . -def getdimension(var: _Var) -> list[Incomplete] | None: ... +def getdimension(var: _Var) -> list[Any] | None: ... def getfortranname(rout: _ROut) -> str: ... def getmultilineblock(rout: _ROut, blockname: str, comment: _Bool = 1, counter: int = 0) -> str | None: ... def getcallstatement(rout: _ROut) -> str | None: ... @@ -246,11 +246,8 @@ def replace(str: list[str], d: str, defaultsep: str = "") -> list[str]: ... def replace(str: str, d: str, defaultsep: str = "") -> str: ... # -def dictappend( - rd: Mapping[str, Incomplete], - ar: Mapping[str, Incomplete] | list[Mapping[str, Incomplete]], -) -> dict[str, Incomplete]: ... -def applyrules(rules: Mapping[str, Incomplete], d: Mapping[str, Incomplete], var: _Var = {}) -> dict[str, Incomplete]: ... +def dictappend(rd: Mapping[str, object], ar: Mapping[str, object] | list[Mapping[str, object]]) -> dict[str, Any]: ... +def applyrules(rules: Mapping[str, object], d: Mapping[str, object], var: _Var = {}) -> dict[str, Any]: ... # def get_f2py_modulename(source: FileDescriptorOrPath) -> str: ... diff --git a/src/numpy-stubs/f2py/cb_rules.pyi b/src/numpy-stubs/f2py/cb_rules.pyi index 0e0356f2..b22f5448 100644 --- a/src/numpy-stubs/f2py/cb_rules.pyi +++ b/src/numpy-stubs/f2py/cb_rules.pyi @@ -1,4 +1,3 @@ -from _typeshed import Incomplete from collections.abc import Mapping from typing import Any, Final @@ -14,5 +13,5 @@ cb_arg_rules: Final[list[dict[str, str | Any]]] = ... cb_map: Final[dict[str, list[list[str]]]] = ... -def buildcallbacks(m: Mapping[str, Incomplete]) -> None: ... -def buildcallback(rout: Mapping[str, Incomplete], um: Mapping[str, Incomplete]) -> None: ... +def buildcallbacks(m: Mapping[str, object]) -> None: ... +def buildcallback(rout: Mapping[str, object], um: Mapping[str, object]) -> None: ... diff --git a/src/numpy-stubs/f2py/common_rules.pyi b/src/numpy-stubs/f2py/common_rules.pyi index c62a3f9f..d840de00 100644 --- a/src/numpy-stubs/f2py/common_rules.pyi +++ b/src/numpy-stubs/f2py/common_rules.pyi @@ -1,10 +1,9 @@ -from _typeshed import Incomplete from collections.abc import Mapping -from typing import Final +from typing import Any, Final from .__version__ import version f2py_version: Final = version -def findcommonblocks(block: Mapping[str, Incomplete], top: int = 1) -> list[tuple[str, list[str], dict[str, Incomplete]]]: ... -def buildhooks(m: Mapping[str, Incomplete]) -> tuple[dict[str, Incomplete], str]: ... +def findcommonblocks(block: Mapping[str, object], top: int = 1) -> list[tuple[str, list[str], dict[str, Any]]]: ... +def buildhooks(m: Mapping[str, object]) -> tuple[dict[str, Any], str]: ... diff --git a/src/numpy-stubs/f2py/crackfortran.pyi b/src/numpy-stubs/f2py/crackfortran.pyi index e7fc26fb..1d7ae353 100644 --- a/src/numpy-stubs/f2py/crackfortran.pyi +++ b/src/numpy-stubs/f2py/crackfortran.pyi @@ -1,5 +1,5 @@ import re -from _typeshed import Incomplete, StrOrBytesPath, StrPath +from _typeshed import StrOrBytesPath, StrPath from collections.abc import Callable, Iterable, Mapping from typing import IO, Any, Concatenate, Final, Literal as L, ParamSpec, TypeAlias, overload from typing_extensions import Never @@ -149,16 +149,12 @@ def crackline(line: str, reset: int = 0) -> None: ... def markouterparen(line: str) -> str: ... def markoutercomma(line: str, comma: str = ",") -> str: ... def unmarkouterparen(line: str) -> str: ... -def appenddecl( - decl: Mapping[str, Incomplete] | None, - decl2: Mapping[str, Incomplete] | None, - force: int = 1, -) -> dict[str, Incomplete]: ... +def appenddecl(decl: Mapping[str, object] | None, decl2: Mapping[str, object] | None, force: int = 1) -> dict[str, Any]: ... # def parse_name_for_bind(line: str) -> tuple[str, str | None]: ... def analyzeline(m: re.Match[str], case: str, line: str) -> None: ... -def appendmultiline(group: dict[str, Incomplete], context_name: str, ml: str) -> None: ... +def appendmultiline(group: dict[str, Any], context_name: str, ml: str) -> None: ... def cracktypespec0(typespec: str, ll: str | None) -> tuple[str, str | None, str | None, str | None]: ... # @@ -171,10 +167,10 @@ def cracktypespec(typespec: str, selector: str | None) -> tuple[dict[str, str] | def setattrspec(decl: dict[str, list[str]], attr: str | None, force: int = 0) -> dict[str, list[str]]: ... def setkindselector(decl: dict[str, dict[str, str]], sel: dict[str, str], force: int = 0) -> dict[str, dict[str, str]]: ... def setcharselector(decl: dict[str, dict[str, str]], sel: dict[str, str], force: int = 0) -> dict[str, dict[str, str]]: ... -def getblockname(block: Mapping[str, Any], unknown: str = "unknown") -> str: ... -def setmesstext(block: Mapping[str, Any]) -> None: ... -def get_usedict(block: Mapping[str, Any]) -> dict[str, str]: ... -def get_useparameters(block: Mapping[str, Any], param_map: Mapping[str, str] | None = None) -> dict[str, str]: ... +def getblockname(block: Mapping[str, object], unknown: str = "unknown") -> str: ... +def setmesstext(block: Mapping[str, object]) -> None: ... +def get_usedict(block: Mapping[str, object]) -> dict[str, str]: ... +def get_useparameters(block: Mapping[str, object], param_map: Mapping[str, str] | None = None) -> dict[str, str]: ... # @overload @@ -182,34 +178,26 @@ def postcrack2( block: dict[str, Any], tab: str = "", param_map: Mapping[str, str] | None = None, -) -> dict[str, str | Incomplete]: ... +) -> dict[str, str | Any]: ... @overload def postcrack2( block: list[dict[str, Any]], tab: str = "", param_map: Mapping[str, str] | None = None, -) -> list[dict[str, str | Incomplete]]: ... +) -> list[dict[str, str | Any]]: ... # @overload -def postcrack( - block: dict[str, Any], - args: Mapping[str, str] | None = None, - tab: str = "", -) -> dict[str, Incomplete]: ... +def postcrack(block: dict[str, Any], args: Mapping[str, str] | None = None, tab: str = "") -> dict[str, Any]: ... @overload -def postcrack( - block: list[dict[str, str]], - args: Mapping[str, str] | None = None, - tab: str = "", -) -> list[dict[str, Incomplete]]: ... +def postcrack(block: list[dict[str, str]], args: Mapping[str, str] | None = None, tab: str = "") -> list[dict[str, Any]]: ... # -def sortvarnames(vars: Mapping[str, Any]) -> list[str]: ... -def analyzecommon(block: Mapping[str, Any]) -> dict[str, Incomplete]: ... -def analyzebody(block: Mapping[str, Any], args: Mapping[str, str], tab: str = "") -> list[dict[str, Incomplete]]: ... -def buildimplicitrules(block: Mapping[str, Any]) -> tuple[dict[str, dict[str, str]], dict[str, str]]: ... -def myeval(e: str, g: Incomplete | None = None, l: Incomplete | None = None) -> float: ... +def sortvarnames(vars: Mapping[str, object]) -> list[str]: ... +def analyzecommon(block: Mapping[str, object]) -> dict[str, Any]: ... +def analyzebody(block: Mapping[str, object], args: Mapping[str, str], tab: str = "") -> list[dict[str, Any]]: ... +def buildimplicitrules(block: Mapping[str, object]) -> tuple[dict[str, dict[str, str]], dict[str, str]]: ... +def myeval(e: str, g: object | None = None, l: object | None = None) -> float: ... # def getlincoef(e: str, xset: set[str]) -> tuple[float | None, float | None, str | None]: ... @@ -222,20 +210,20 @@ def get_parameters(vars: Mapping[str, Mapping[str, str]], global_params: dict[st def analyzevars(block: Mapping[str, Any]) -> dict[str, dict[str, str]]: ... # -def param_eval(v: str, g_params: dict[str, Any], params: Mapping[str, Any], dimspec: str | None = None) -> dict[str, Any]: ... +def param_eval(v: str, g_params: dict[str, Any], params: Mapping[str, object], dimspec: str | None = None) -> dict[str, Any]: ... def param_parse(d: str, params: Mapping[str, str]) -> str: ... -def expr2name(a: str, block: Mapping[str, Any], args: list[str] = []) -> str: ... -def analyzeargs(block: Mapping[str, Any]) -> dict[str, Any]: ... +def expr2name(a: str, block: Mapping[str, object], args: list[str] = []) -> str: ... +def analyzeargs(block: Mapping[str, object]) -> dict[str, Any]: ... # -def determineexprtype(expr: str, vars: Mapping[str, Any], rules: dict[str, Any] = {}) -> dict[str, Any]: ... -def crack2fortrangen(block: Mapping[str, Any], tab: str = "\n", as_interface: bool = False) -> str: ... -def common2fortran(common: Mapping[str, Any], tab: str = "") -> str: ... -def use2fortran(use: Mapping[str, Any], tab: str = "") -> str: ... +def determineexprtype(expr: str, vars: Mapping[str, object], rules: dict[str, Any] = {}) -> dict[str, Any]: ... +def crack2fortrangen(block: Mapping[str, object], tab: str = "\n", as_interface: bool = False) -> str: ... +def common2fortran(common: Mapping[str, object], tab: str = "") -> str: ... +def use2fortran(use: Mapping[str, object], tab: str = "") -> str: ... def true_intent_list(var: dict[str, list[str]]) -> list[str]: ... def vars2fortran( - block: Mapping[str, Mapping[str, Any]], - vars: Mapping[str, Any], + block: Mapping[str, Mapping[str, object]], + vars: Mapping[str, object], args: Mapping[str, str], tab: str = "", as_interface: bool = False, diff --git a/src/numpy-stubs/f2py/f2py2e.pyi b/src/numpy-stubs/f2py/f2py2e.pyi index 2a563d51..68bd84de 100644 --- a/src/numpy-stubs/f2py/f2py2e.pyi +++ b/src/numpy-stubs/f2py/f2py2e.pyi @@ -1,9 +1,8 @@ import argparse import pprint -from _typeshed import Incomplete from collections.abc import Hashable, Iterable, Mapping, MutableMapping, Sequence from types import ModuleType -from typing import Final, TypedDict, type_check_only +from typing import Any, Final, TypedDict, type_check_only from typing_extensions import NotRequired, TypeVar from .__version__ import version @@ -53,8 +52,8 @@ def main() -> None: ... # def scaninputline(inputline: Iterable[str]) -> tuple[list[str], dict[str, _Bool]]: ... -def callcrackfortran(files: list[str], options: dict[str, bool]) -> list[dict[str, Incomplete]]: ... -def buildmodules(lst: Iterable[Mapping[str, object]]) -> dict[str, dict[str, Incomplete]]: ... +def callcrackfortran(files: list[str], options: dict[str, bool]) -> list[dict[str, Any]]: ... +def buildmodules(lst: Iterable[Mapping[str, object]]) -> dict[str, dict[str, Any]]: ... def dict_append(d_out: MutableMapping[_KT, _VT], d_in: Mapping[_KT, _VT]) -> None: ... def filter_files( prefix: str, @@ -63,7 +62,7 @@ def filter_files( remove_prefix: _Bool | None = None, ) -> tuple[list[str], list[str]]: ... def get_prefix(module: ModuleType) -> str: ... -def get_newer_options(iline: Iterable[str]) -> tuple[list[str], Incomplete, list[str]]: ... +def get_newer_options(iline: Iterable[str]) -> tuple[list[str], Any, list[str]]: ... # def f2py_parser() -> argparse.ArgumentParser: ... diff --git a/src/numpy-stubs/f2py/f90mod_rules.pyi b/src/numpy-stubs/f2py/f90mod_rules.pyi index 24baf49c..4df004ee 100644 --- a/src/numpy-stubs/f2py/f90mod_rules.pyi +++ b/src/numpy-stubs/f2py/f90mod_rules.pyi @@ -1,6 +1,5 @@ -from _typeshed import Incomplete from collections.abc import Mapping -from typing import Final +from typing import Any, Final from .auxfuncs import isintent_dict as isintent_dict @@ -13,5 +12,5 @@ fgetdims1: Final[str] = ... fgetdims2: Final[str] = ... fgetdims2_sa: Final[str] = ... -def findf90modules(m: Mapping[str, Incomplete]) -> list[dict[str, Incomplete]]: ... -def buildhooks(pymod: Mapping[str, Incomplete]) -> dict[str, Incomplete]: ... +def findf90modules(m: Mapping[str, object]) -> list[dict[str, Any]]: ... +def buildhooks(pymod: Mapping[str, object]) -> dict[str, Any]: ... diff --git a/src/numpy-stubs/f2py/use_rules.pyi b/src/numpy-stubs/f2py/use_rules.pyi index 4ba4b1f6..58c7f9b5 100644 --- a/src/numpy-stubs/f2py/use_rules.pyi +++ b/src/numpy-stubs/f2py/use_rules.pyi @@ -1,10 +1,9 @@ -from _typeshed import Incomplete from collections.abc import Mapping -from typing import Final +from typing import Any, Final __version__: Final[str] = ... f2py_version: Final = "See `f2py -v`" usemodule_rules: Final[dict[str, str | list[str]]] = ... -def buildusevars(m: Mapping[str, Incomplete], r: Mapping[str, Mapping[str, Incomplete]]) -> dict[str, Incomplete]: ... -def buildusevar(name: str, realname: str, vars: Mapping[str, Mapping[str, str]], usemodulename: str) -> dict[str, Incomplete]: ... +def buildusevars(m: Mapping[str, object], r: Mapping[str, Mapping[str, object]]) -> dict[str, Any]: ... +def buildusevar(name: str, realname: str, vars: Mapping[str, Mapping[str, object]], usemodulename: str) -> dict[str, Any]: ...