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}")