-
Notifications
You must be signed in to change notification settings - Fork 2.3k
/
build.py
104 lines (94 loc) 路 4.01 KB
/
build.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import importlib
import shutil
import subprocess
from pathlib import Path
import semantic_version
import typer
from tomlkit import dump, parse
from typing_extensions import Annotated
import gradio
from gradio.cli.commands.display import LivePanelDisplay
gradio_template_path = Path(gradio.__file__).parent / "templates" / "frontend"
gradio_node_path = Path(gradio.__file__).parent / "node" / "dev" / "files" / "index.js"
def _build(
path: Annotated[
Path, typer.Argument(help="The directory of the custom component.")
] = Path("."),
build_frontend: Annotated[
bool, typer.Option(help="Whether to build the frontend as well.")
] = True,
bump_version: Annotated[
bool, typer.Option(help="Whether to bump the version number automatically.")
] = False,
):
name = Path(path).resolve()
if not (name / "pyproject.toml").exists():
raise ValueError(f"Cannot find pyproject.toml file in {name}")
with LivePanelDisplay() as live:
live.update(
f":package: Building package in [orange3]{str(name.name)}[/]", add_sleep=0.2
)
pyproject_toml = parse((path / "pyproject.toml").read_text())
package_name = pyproject_toml["project"]["name"] # type: ignore
try:
importlib.import_module(package_name) # type: ignore
except ModuleNotFoundError as e:
raise ValueError(
f"Your custom component package ({package_name}) is not installed! "
"Please install it with the gradio cc install command before buillding it."
) from e
if bump_version:
pyproject_toml = parse((path / "pyproject.toml").read_text())
version = semantic_version.Version(
pyproject_toml["project"]["version"] # type: ignore
).next_patch()
live.update(
f":1234: Using version [bold][magenta]{version}[/][/]. "
"Set [bold][magenta]--no-bump-version[/][/] to use the version in pyproject.toml file."
)
pyproject_toml["project"]["version"] = str(version) # type: ignore
with open(path / "pyproject.toml", "w") as f:
dump(pyproject_toml, f)
else:
version = pyproject_toml["project"]["version"] # type: ignore
live.update(
f":1234: Package will use version [bold][magenta]{version}[/][/] defined in pyproject.toml file. "
"Set [bold][magenta]--bump-version[/][/] to automatically bump the version number."
)
if build_frontend:
live.update(":art: Building frontend")
component_directory = path.resolve()
node = shutil.which("node")
if not node:
raise ValueError(
"node must be installed in order to run build command."
)
node_cmds = [
node,
gradio_node_path,
"--component-directory",
component_directory,
"--root",
gradio_template_path,
"--mode",
"build",
]
pipe = subprocess.run(node_cmds, capture_output=True, text=True)
if pipe.returncode != 0:
live.update(":red_square: Build failed!")
live.update(pipe.stderr)
live.update(pipe.stdout)
return
else:
live.update(":white_check_mark: Build succeeded!")
cmds = [shutil.which("python"), "-m", "build", str(name)]
live.update(f":construction_worker: Building... [grey37]({' '.join(cmds)})[/]")
pipe = subprocess.run(cmds, capture_output=True, text=True)
if pipe.returncode != 0:
live.update(":red_square: Build failed!")
live.update(pipe.stderr)
else:
live.update(":white_check_mark: Build succeeded!")
live.update(
f":ferris_wheel: Wheel located in [orange3]{str(name / 'dist')}[/]"
)