| import argparse | |
| import importlib | |
| import inspect | |
| import os | |
| from pathlib import Path | |
| import sys | |
| from tomlkit import dumps, parse | |
| from gradio.blocks import BlockContext | |
| from gradio.components import Component | |
| if __name__ == "__main__": | |
| parser = argparse.ArgumentParser(description="Description of your program") | |
| parser.add_argument("-m", "--mode", help="Build mode or dev mode") | |
| args = parser.parse_args() | |
| try: | |
| with open("../pyproject.toml") as f: | |
| pyproject_source = f.read() | |
| pyproject_toml = parse(pyproject_source) | |
| keywords = pyproject_toml["project"]["keywords"] | |
| custom_component = ("gradio-custom-component" in keywords or | |
| "gradio custom component" in keywords) | |
| if not custom_component: | |
| sys.exit(0) | |
| module_name = pyproject_toml["project"]["name"] | |
| module = importlib.import_module(module_name) | |
| artifacts: list[str] = pyproject_toml["tool"]["hatch"]["build"]["artifacts"] | |
| def get_relative_path(path): | |
| return ( | |
| os.path.abspath(Path(__file__).parent / path) | |
| .replace(os.path.abspath(os.getcwd()), "") | |
| .lstrip("/") | |
| ) | |
| for name in dir(module): | |
| value = getattr(module, name) | |
| if name.startswith("__"): | |
| continue | |
| if inspect.isclass(value) and ( | |
| issubclass(value, BlockContext) or issubclass(value, Component) | |
| ): | |
| file_location = Path(inspect.getfile(value)).parent | |
| found = [ | |
| x | |
| for x in artifacts | |
| if get_relative_path(Path("..") / x) | |
| == get_relative_path(file_location / value.TEMPLATE_DIR) | |
| ] | |
| if len(found) == 0: | |
| artifact = "/" + (os.path.abspath(file_location / value.TEMPLATE_DIR) | |
| .replace(os.path.abspath(Path("..")), "") | |
| .lstrip("/")) | |
| if artifact not in artifacts: | |
| artifacts.append(artifact) | |
| print( | |
| f"{name}~|~|~|~{os.path.abspath(file_location / value.TEMPLATE_DIR)}~|~|~|~{os.path.abspath(file_location / value.FRONTEND_DIR)}~|~|~|~{value.get_component_class_id()}" | |
| ) | |
| continue | |
| if args.mode == "build": | |
| pyproject_toml["tool"]["hatch"]["build"]["artifacts"] = artifacts | |
| with open("../pyproject.toml", "w") as f: | |
| f.write(dumps(pyproject_toml)) | |
| except Exception as e: | |
| _, _, exc_tb = sys.exc_info() | |
| print(f"|EXCEPTION|:{str(e)}, examine.py line {exc_tb.tb_lineno}") |