Skip to content

Commit

Permalink
Add "Install All" button to dependency manager (#2931)
Browse files Browse the repository at this point in the history
  • Loading branch information
RunDevelopment authored Jun 2, 2024
1 parent 171cc66 commit 7047b95
Show file tree
Hide file tree
Showing 3 changed files with 285 additions and 160 deletions.
117 changes: 65 additions & 52 deletions backend/src/server_host.py
Original file line number Diff line number Diff line change
Expand Up @@ -219,26 +219,14 @@ def deps_to_dep_info(deps: list[api.Dependency]) -> list[DependencyInfo]:
]


@app.route("/packages/uninstall", methods=["POST"])
async def uninstall_dependencies_request(request: Request):
full_data = dict(request.json) # type: ignore
package_to_uninstall = full_data["package"]

worker = await AppContext.get(request.app).get_worker()
packages = await worker.get_packages()

package = next((x for x in packages if x.id == package_to_uninstall), None)

if package is None:
return json(
{"status": "error", "message": f"Package {package_to_uninstall} not found"},
status=404,
)

def create_update_progress(ctx: AppContext) -> UpdateProgressFn:
def update_progress(
message: str, progress: float, status_progress: float | None = None
message: str,
progress: float,
status_progress: float | None = None,
):
return AppContext.get(request.app).setup_queue.put_and_wait(
logger.info(f"Progress: {message} {progress} {status_progress}")
return ctx.setup_queue.put_and_wait(
{
"event": "package-install-status",
"data": {
Expand All @@ -250,14 +238,44 @@ def update_progress(
timeout=0.01,
)

return update_progress


@app.route("/packages/uninstall", methods=["POST"])
async def uninstall_dependencies_request(request: Request):
package_ids_to_install: list[str] = request.json["packages"]

ctx = AppContext.get(request.app)
worker = await ctx.get_worker()
packages = await worker.get_packages()

packages_to_install = [x for x in packages if x.id in package_ids_to_install]
valid_package_ids = [p.id for p in packages]
invalid_package_ids = [
x for x in package_ids_to_install if x not in valid_package_ids
]
if len(invalid_package_ids) > 0:
return json(
{
"status": "error",
"message": f"Package {invalid_package_ids[0]} not found",
},
status=404,
)

try:
await worker.stop()
try:
await uninstall_dependencies(
deps_to_dep_info(package.dependencies), update_progress, logger
)
finally:
await worker.start()
progress = create_update_progress(ctx)
deps: list[DependencyInfo] = []
for p in packages_to_install:
deps.extend(deps_to_dep_info(p.dependencies))

if len(deps) > 0:
await worker.stop()
try:
await uninstall_dependencies(deps, progress, logger)
finally:
await worker.start()

return json({"status": "ok"})
except Exception as ex:
logger.error(f"Error uninstalling dependencies: {ex}", exc_info=True)
Expand All @@ -266,41 +284,36 @@ def update_progress(

@app.route("/packages/install", methods=["POST"])
async def install_dependencies_request(request: Request):
full_data = dict(request.json) # type: ignore
package_to_install = full_data["package"]
package_ids_to_install: list[str] = request.json["packages"]

def update_progress(
message: str, progress: float, status_progress: float | None = None
):
logger.info(f"Progress: {message} {progress} {status_progress}")
return AppContext.get(request.app).setup_queue.put_and_wait(
{
"event": "package-install-status",
"data": {
"message": message,
"progress": progress,
"statusProgress": status_progress,
},
},
timeout=0.01,
)

worker = await AppContext.get(request.app).get_worker()
ctx = AppContext.get(request.app)
worker = await ctx.get_worker()
packages = await worker.get_packages()
package = next((x for x in packages if x.id == package_to_install), None)

if package is None:
packages_to_install = [x for x in packages if x.id in package_ids_to_install]
valid_package_ids = [p.id for p in packages]
invalid_package_ids = [
x for x in package_ids_to_install if x not in valid_package_ids
]
if len(invalid_package_ids) > 0:
return json(
{"status": "error", "message": f"Package {package_to_install} not found"},
{
"status": "error",
"message": f"Package {invalid_package_ids[0]} not found",
},
status=404,
)

try:
await worker.stop()
await install_dependencies(
deps_to_dep_info(package.dependencies), update_progress, logger
)
await worker.start()
progress = create_update_progress(ctx)
deps: list[DependencyInfo] = []
for p in packages_to_install:
deps.extend(deps_to_dep_info(p.dependencies))

if len(deps) > 0:
await worker.stop()
await install_dependencies(deps, progress, logger)
await worker.start()
return json({"status": "ok"})
except Exception as ex:
logger.error(f"Error installing dependencies: {ex}", exc_info=True)
Expand Down
19 changes: 5 additions & 14 deletions src/common/Backend.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import {
OutputData,
OutputTypes,
Package,
PackageId,
PackageSettings,
PyPiName,
PythonInfo,
Expand Down Expand Up @@ -241,22 +242,12 @@ export class Backend {
return this.fetchJson('/features', 'GET');
}

installPackage(pkg: Package): Promise<void> {
return this.fetchJson('/packages/install', 'POST', {
package: pkg.id,
});
installPackages(packages: readonly PackageId[]): Promise<void> {
return this.fetchJson('/packages/install', 'POST', { packages });
}

uninstallPackage(pkg: Package): Promise<void> {
return this.fetchJson('/packages/uninstall', 'POST', {
package: pkg.id,
});
}

updatePackage(pkg: Package): Promise<void> {
return this.fetchJson('/packages/install', 'POST', {
package: pkg.id,
});
uninstallPackages(packages: readonly PackageId[]): Promise<void> {
return this.fetchJson('/packages/uninstall', 'POST', { packages });
}

shutdown(): Promise<void> {
Expand Down
Loading

0 comments on commit 7047b95

Please sign in to comment.