Files
renpy/scripts/relative_imports.py
2025-01-05 00:48:05 -05:00

101 lines
2.2 KiB
Python
Executable File

#!/usr/bin/env python3
import pathlib
import collections
import re
ROOT = pathlib.Path(__file__).parent.parent
HEADER = "# Generated by scripts/relative_imports.py, do not edit below this line."
GENERATED_MODULES : str = """
renpy.styledata.style_activate_functions
renpy.styledata.style_functions
renpy.styledata.style_hover_functions
renpy.styledata.style_idle_functions
renpy.styledata.style_insensitive_functions
renpy.styledata.style_selected_activate_functions
renpy.styledata.style_selected_functions
renpy.styledata.style_selected_hover_functions
renpy.styledata.style_selected_idle_functions
renpy.styledata.style_selected_insensitive_functions
"""
def find_modules():
"""
Finds the names of all modules.
"""
modules : list[str] = GENERATED_MODULES.split()
# A list of root, pattern pairs.
patterns = [
(ROOT, "renpy/**/*.py"),
(ROOT, "renpy/**/*.pyx"),
]
for root, pattern in patterns:
for i in ROOT.glob(pattern):
i = i.relative_to(ROOT)
mod = str(i.with_suffix("")).replace("/", ".")
if mod.endswith(".__init__"):
mod = mod[:-9]
modules.append(mod)
modules.sort()
package_modules = collections.defaultdict(list)
for mod in modules:
package, _, module = mod.rpartition(".")
if not package.startswith("renpy"):
continue
package_modules[package].append(module)
return package_modules
def generate(package, modules):
if package == "renpy.common":
return
fn = package.replace(".", "/") + "/__init__.py"
p = ROOT / fn
text = p.read_text()
text = text.split("\n")
new_text = [ ]
for i in text:
if i == HEADER:
break
new_text.append(i)
text = "\n".join(new_text)
text = text.rstrip("\n")
text = text + "\n\n\n"
text += HEADER + "\n"
text += "import typing\n"
text += "\n"
text += "if typing.TYPE_CHECKING:\n"
for mod in modules:
text += f" from . import {mod} as {mod}\n"
p.write_text(text)
def main():
package_modules = find_modules()
for package, modules in package_modules.items():
generate(package, modules)
if __name__ == "__main__":
main()