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