Skip to content

Commit

Permalink
Merge pull request #17 from Amulet-Team/tools
Browse files Browse the repository at this point in the history
Moved tools implementation to a submodule
  • Loading branch information
gentlegiantJGC authored Nov 15, 2024
2 parents ddae0b6 + 9dc4519 commit b210378
Show file tree
Hide file tree
Showing 4 changed files with 8 additions and 593 deletions.
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,6 @@
[submodule "leveldb-mcpe"]
path = submodules/leveldb-mcpe
url = https://github.com/Amulet-Team/leveldb-mcpe
[submodule "tools/shared"]
path = tools/shared
url = https://github.com/Amulet-Team/cpp-tools
158 changes: 3 additions & 155 deletions tools/generate_pybind_stubs.py
Original file line number Diff line number Diff line change
@@ -1,26 +1,7 @@
import os
import glob
import importlib.util
import sys
import subprocess
import re
import pybind11_stubgen
from pybind11_stubgen.structs import Identifier
from pybind11_stubgen.parser.mixins.filter import FilterClassMembers

UnionPattern = re.compile(
r"^(?P<variable>[a-zA-Z_][a-zA-Z0-9_]*): types\.UnionType\s*#\s*value = (?P<value>.*)$",
flags=re.MULTILINE,
)
VersionPattern = re.compile(r"(?P<var>[a-zA-Z0-9_].*): str = '.*?'")


def union_sub_func(match: re.Match) -> str:
return f'{match.group("variable")}: typing.TypeAlias = {match.group("value")}'


def str_sub_func(match: re.Match) -> str:
return f"{match.group('var')}: str"
from shared.generate_pybind_stubs import run


def get_module_path(name: str) -> str:
Expand All @@ -35,143 +16,10 @@ def get_package_dir(name: str) -> str:
return os.path.dirname(get_module_path(name))


def patch_stubgen():
# Is there a better way to add items to the blacklist?
# Pybind11
FilterClassMembers._FilterClassMembers__class_member_blacklist.add(
Identifier("_pybind11_conduit_v1_")
)
# Python
FilterClassMembers._FilterClassMembers__class_member_blacklist.add(
Identifier("__new__")
)
FilterClassMembers._FilterClassMembers__class_member_blacklist.add(
Identifier("__subclasshook__")
)
# Pickle
FilterClassMembers._FilterClassMembers__class_member_blacklist.add(
Identifier("__getnewargs__")
)
FilterClassMembers._FilterClassMembers__class_member_blacklist.add(
Identifier("__getstate__")
)
FilterClassMembers._FilterClassMembers__class_member_blacklist.add(
Identifier("__setstate__")
)
# ABC
FilterClassMembers._FilterClassMembers__attribute_blacklist.add(
Identifier("__abstractmethods__")
)
FilterClassMembers._FilterClassMembers__attribute_blacklist.add(
Identifier("__orig_bases__")
)
FilterClassMembers._FilterClassMembers__attribute_blacklist.add(
Identifier("__parameters__")
)
FilterClassMembers._FilterClassMembers__attribute_blacklist.add(
Identifier("_abc_impl")
)
# Protocol
FilterClassMembers._FilterClassMembers__attribute_blacklist.add(
Identifier("__protocol_attrs__")
)
FilterClassMembers._FilterClassMembers__attribute_blacklist.add(
Identifier("__non_callable_proto_members__")
)
FilterClassMembers._FilterClassMembers__attribute_blacklist.add(
Identifier("_is_protocol")
)
FilterClassMembers._FilterClassMembers__attribute_blacklist.add(
Identifier("_is_runtime_protocol")
)
# dataclass
FilterClassMembers._FilterClassMembers__attribute_blacklist.add(
Identifier("__dataclass_fields__")
)
FilterClassMembers._FilterClassMembers__attribute_blacklist.add(
Identifier("__dataclass_params__")
)
FilterClassMembers._FilterClassMembers__attribute_blacklist.add(
Identifier("__match_args__")
)
# Buffer protocol
FilterClassMembers._FilterClassMembers__class_member_blacklist.add(
Identifier("__buffer__")
)
FilterClassMembers._FilterClassMembers__class_member_blacklist.add(
Identifier("__release_buffer__")
)


def main() -> None:
def main():
path = get_package_dir("leveldb")
src_path = os.path.dirname(path)

# Remove all existing stub files
print("Removing stub files...")
for stub_path in glob.iglob(
os.path.join(glob.escape(src_path), "**", "*.pyi"), recursive=True
):
os.remove(stub_path)

# Extend pybind11-stubgen
patch_stubgen()

# Call pybind11-stubgen
print("Running pybind11-stubgen...")
pybind11_stubgen.main([
f"--output-dir={src_path}",
"leveldb",
])

# Run normal stubgen on the python files
# print("Running stubgen...")
# stubgen.main([
# *glob.glob(
# os.path.join(glob.escape(src_path), "**", "*.py"), recursive=True
# ),
# "-o",
# src_path,
# "--include-docstrings",
# ])

# Remove stub files generated for python modules
for stub_path in glob.iglob(
os.path.join(glob.escape(src_path), "**", "*.pyi"), recursive=True
):
if os.path.isfile(stub_path[:-1]):
os.remove(stub_path)

print("Patching stub files...")
# Fix some issues and reformat the stub files.
stub_paths = glob.glob(
os.path.join(glob.escape(src_path), "**", "*.pyi"), recursive=True
)
for stub_path in stub_paths:
with open(stub_path, encoding="utf-8") as f:
pyi = f.read()
pyi = UnionPattern.sub(union_sub_func, pyi)
pyi = VersionPattern.sub(str_sub_func, pyi)
with open(stub_path, "w", encoding="utf-8") as f:
f.write(pyi)

subprocess.run(
[
"isort",
*stub_paths,
]
)

subprocess.run(
[
"autoflake",
"--in-place",
"--remove-unused-variables",
*stub_paths,
]
)

subprocess.run([sys.executable, "-m", "black", src_path])
run(src_path, "leveldb")


if __name__ == "__main__":
Expand Down
Loading

0 comments on commit b210378

Please sign in to comment.