2
0
mirror of https://github.com/frappe/bench.git synced 2024-09-29 07:19:05 +00:00

feat: Setup Requirements for specific apps (#1265)

* feat:  flag for Setup Requirements

* chore: Moved __get_installed_app method in Bench

* fix: improve help message

* fix: allow muliple apps to be specified

Co-authored-by: Sagar Vora <sagar@resilient.tech>
Co-authored-by: gavin <gavin18d@gmail.com>
This commit is contained in:
DaizyModi 2022-02-18 17:34:39 +05:30 committed by GitHub
parent 65a47a6110
commit 28e681689f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 52 additions and 34 deletions

View File

@ -173,7 +173,7 @@ class App(AppMeta):
shutil.move(active_app_path, archived_app_path) shutil.move(active_app_path, archived_app_path)
@step(title="Installing App {repo}", success="App {repo} Installed") @step(title="Installing App {repo}", success="App {repo} Installed")
def install(self, skip_assets=False, verbose=False): def install(self, skip_assets=False, verbose=False, restart_bench=True):
import bench.cli import bench.cli
from bench.utils.app import get_app_name from bench.utils.app import get_app_name
@ -190,7 +190,11 @@ class App(AppMeta):
) )
install_app( install_app(
app=app_name, bench_path=self.bench.name, verbose=verbose, skip_assets=skip_assets, app=app_name,
bench_path=self.bench.name,
verbose=verbose,
skip_assets=skip_assets,
restart_bench=restart_bench
) )
@step(title="Uninstalling App {repo}", success="App {repo} Uninstalled") @step(title="Uninstalling App {repo}", success="App {repo} Uninstalled")

View File

@ -143,6 +143,14 @@ class Bench(Base, Validator):
if systemd and conf.get("restart_systemd_on_update"): if systemd and conf.get("restart_systemd_on_update"):
restart_systemd_processes(bench_path=self.name, web_workers=web) restart_systemd_processes(bench_path=self.name, web_workers=web)
def get_installed_apps(self) -> List:
"""Returns list of installed apps on bench, not in excluded_apps.txt
"""
apps = [app for app in self.apps if app not in self.excluded_apps]
apps.remove("frappe")
apps.insert(0, "frappe")
return apps
class BenchApps(MutableSequence): class BenchApps(MutableSequence):
def __init__(self, bench: Bench): def __init__(self, bench: Bench):
@ -317,35 +325,29 @@ class BenchSetup(Base):
logger.log("backups were set up") logger.log("backups were set up")
def __get_installed_apps(self) -> List:
"""Returns list of installed apps on bench, not in excluded_apps.txt
"""
apps = [app for app in self.bench.apps if app not in self.bench.excluded_apps]
apps.remove("frappe")
apps.insert(0, "frappe")
return apps
@job(title="Setting Up Bench Dependencies", success="Bench Dependencies Set Up") @job(title="Setting Up Bench Dependencies", success="Bench Dependencies Set Up")
def requirements(self): def requirements(self, apps=None):
"""Install and upgrade all installed apps on given Bench """Install and upgrade all installed apps on given Bench if apps not specified
""" """
from bench.app import App from bench.app import App
apps = self.__get_installed_apps() if not apps:
apps = self.bench.get_installed_apps()
self.pip() self.pip()
print(f"Installing {len(apps)} applications...") print(f"Installing {len(apps)} applications...")
for app in apps: for app in apps:
App(app, bench=self.bench, to_clone=False).install() App(app, bench=self.bench, to_clone=False).install( skip_assets=True, restart_bench=False)
def python(self): def python(self, apps=None):
"""Install and upgrade Python dependencies for installed apps on given Bench """Install and upgrade Python dependencies for installed apps on given Bench if app not specified
""" """
import bench.cli import bench.cli
apps = self.__get_installed_apps() if not apps:
apps = self.bench.get_installed_apps()
quiet_flag = "" if bench.cli.verbose else "--quiet" quiet_flag = "" if bench.cli.verbose else "--quiet"
@ -356,12 +358,12 @@ class BenchSetup(Base):
log(f"\nInstalling python dependencies for {app}", level=3, no_log=True) log(f"\nInstalling python dependencies for {app}", level=3, no_log=True)
self.run(f"{self.bench.python} -m pip install {quiet_flag} --upgrade -e {app_path}") self.run(f"{self.bench.python} -m pip install {quiet_flag} --upgrade -e {app_path}")
def node(self): def node(self, apps=None):
"""Install and upgrade Node dependencies for all apps on given Bench """Install and upgrade Node dependencies for all apps on given Bench if app not specified
""" """
from bench.utils.bench import update_node_packages from bench.utils.bench import update_node_packages
return update_node_packages(bench_path=self.bench.name) return update_node_packages(bench_path=self.bench.name, apps=apps)
class BenchTearDown: class BenchTearDown:

View File

@ -131,27 +131,33 @@ def setup_procfile():
def setup_socketio(): def setup_socketio():
return return
@click.command("requirements", help="Setup Python and Node dependencies") @click.command("requirements")
@click.option("--node", help="Update only Node packages", default=False, is_flag=True) @click.option("--node", help="Update only Node packages", default=False, is_flag=True)
@click.option("--python", help="Update only Python packages", default=False, is_flag=True) @click.option("--python", help="Update only Python packages", default=False, is_flag=True)
@click.option("--dev", help="Install optional python development dependencies", default=False, is_flag=True) @click.option("--dev", help="Install optional python development dependencies", default=False, is_flag=True)
def setup_requirements(node=False, python=False, dev=False): @click.argument("apps", nargs=-1)
def setup_requirements(node=False, python=False, dev=False, apps=None):
"""
Setup Python and Node dependencies.
You can optionally specify one or more apps to specify dependencies for.
"""
from bench.bench import Bench from bench.bench import Bench
bench = Bench(".") bench = Bench(".")
if not (node or python or dev): if not (node or python or dev):
bench.setup.requirements() bench.setup.requirements(apps=apps)
elif not node and not dev: elif not node and not dev:
bench.setup.python() bench.setup.python(apps=apps)
elif not python and not dev: elif not python and not dev:
bench.setup.node() bench.setup.node(apps=apps)
else: else:
from bench.utils.bench import install_python_dev_dependencies from bench.utils.bench import install_python_dev_dependencies
install_python_dev_dependencies() install_python_dev_dependencies(apps=apps)
if node: if node:
click.secho("--dev flag only supports python dependencies. All node development dependencies are installed by default.", fg="yellow") click.secho("--dev flag only supports python dependencies. All node development dependencies are installed by default.", fg="yellow")

View File

@ -48,7 +48,7 @@ def get_venv_path():
return venv or log("virtualenv cannot be found", level=2) return venv or log("virtualenv cannot be found", level=2)
def update_node_packages(bench_path="."): def update_node_packages(bench_path=".", apps=None):
print("Updating node packages...") print("Updating node packages...")
from bench.utils.app import get_develop_version from bench.utils.app import get_develop_version
from distutils.version import LooseVersion from distutils.version import LooseVersion
@ -58,9 +58,9 @@ def update_node_packages(bench_path="."):
# After rollup was merged, frappe_version = 10.1 # After rollup was merged, frappe_version = 10.1
# if develop_verion is 11 and up, only then install yarn # if develop_verion is 11 and up, only then install yarn
if v < LooseVersion("11.x.x-develop"): if v < LooseVersion("11.x.x-develop"):
update_npm_packages(bench_path) update_npm_packages(bench_path, apps=apps)
else: else:
update_yarn_packages(bench_path) update_yarn_packages(bench_path, apps=apps)
def install_python_dev_dependencies(bench_path=".", apps=None, verbose=False): def install_python_dev_dependencies(bench_path=".", apps=None, verbose=False):
@ -75,7 +75,7 @@ def install_python_dev_dependencies(bench_path=".", apps=None, verbose=False):
if isinstance(apps, str): if isinstance(apps, str):
apps = [apps] apps = [apps]
elif apps is None: elif apps is None:
apps = [app for app in bench.apps if app not in bench.excluded_apps] apps = bench.get_installed_apps()
for app in apps: for app in apps:
app_path = os.path.join(bench_path, "apps", app) app_path = os.path.join(bench_path, "apps", app)
@ -86,11 +86,14 @@ def install_python_dev_dependencies(bench_path=".", apps=None, verbose=False):
bench.run(f"{bench.python} -m pip install {quiet_flag} --upgrade -r {dev_requirements_path}") bench.run(f"{bench.python} -m pip install {quiet_flag} --upgrade -r {dev_requirements_path}")
def update_yarn_packages(bench_path="."): def update_yarn_packages(bench_path=".", apps=None):
from bench.bench import Bench from bench.bench import Bench
bench = Bench(bench_path) bench = Bench(bench_path)
apps = [app for app in bench.apps if app not in bench.excluded_apps]
if not apps:
apps = bench.get_installed_apps()
apps_dir = os.path.join(bench.name, "apps") apps_dir = os.path.join(bench.name, "apps")
# TODO: Check for stuff like this early on only?? # TODO: Check for stuff like this early on only??
@ -106,11 +109,14 @@ def update_yarn_packages(bench_path="."):
bench.run("yarn install", cwd=app_path) bench.run("yarn install", cwd=app_path)
def update_npm_packages(bench_path="."): def update_npm_packages(bench_path=".", apps=None):
apps_dir = os.path.join(bench_path, "apps") apps_dir = os.path.join(bench_path, "apps")
package_json = {} package_json = {}
for app in os.listdir(apps_dir): if not apps:
apps = os.listdir(apps_dir)
for app in apps:
package_json_path = os.path.join(apps_dir, app, "package.json") package_json_path = os.path.join(apps_dir, app, "package.json")
if os.path.exists(package_json_path): if os.path.exists(package_json_path):