seitime-frappe/frappe/utils/bench_helper.py
Gavin D'souza 006ebcbede refactor: Use pymysql over mariadb client
This is supposed to be a temporary switch to make the parent PR easier
to digest. MariaDB client has some issues with release, and system
dependencies.

This commit may be reverted to enable mariadb client again.
2022-07-22 12:10:54 +05:30

109 lines
2.6 KiB
Python

import importlib
import json
import os
import traceback
import warnings
import click
import frappe
import frappe.utils
click.disable_unicode_literals_warning = True
def main():
commands = get_app_groups()
commands.update({"get-frappe-commands": get_frappe_commands, "get-frappe-help": get_frappe_help})
click.Group(commands=commands)(prog_name="bench")
def get_app_groups():
"""Get all app groups, put them in main group "frappe" since bench is
designed to only handle that"""
commands = dict()
for app in get_apps():
app_commands = get_app_commands(app)
if app_commands:
commands.update(app_commands)
ret = dict(frappe=click.group(name="frappe", commands=commands)(app_group))
return ret
def get_app_group(app):
app_commands = get_app_commands(app)
if app_commands:
return click.group(name=app, commands=app_commands)(app_group)
@click.option("--site")
@click.option("--profile", is_flag=True, default=False, help="Profile")
@click.option("--verbose", is_flag=True, default=False, help="Verbose")
@click.option("--force", is_flag=True, default=False, help="Force")
@click.pass_context
def app_group(ctx, site=False, force=False, verbose=False, profile=False):
ctx.obj = {"sites": get_sites(site), "force": force, "verbose": verbose, "profile": profile}
if ctx.info_name == "frappe":
ctx.info_name = ""
def get_sites(site_arg):
if site_arg == "all":
return frappe.utils.get_sites()
elif site_arg:
return [site_arg]
elif os.environ.get("FRAPPE_SITE"):
return [os.environ.get("FRAPPE_SITE")]
elif os.path.exists("currentsite.txt"):
with open("currentsite.txt") as f:
site = f.read().strip()
if site:
return [site]
return []
def get_app_commands(app):
if os.path.exists(os.path.join("..", "apps", app, app, "commands.py")) or os.path.exists(
os.path.join("..", "apps", app, app, "commands", "__init__.py")
):
try:
app_command_module = importlib.import_module(app + ".commands")
except Exception:
traceback.print_exc()
return []
else:
return []
ret = {}
for command in getattr(app_command_module, "commands", []):
ret[command.name] = command
return ret
@click.command("get-frappe-commands")
def get_frappe_commands():
commands = list(get_app_commands("frappe"))
for app in get_apps():
app_commands = get_app_commands(app)
if app_commands:
commands.extend(list(app_commands))
print(json.dumps(commands))
@click.command("get-frappe-help")
def get_frappe_help():
print(click.Context(get_app_groups()["frappe"]).get_help())
def get_apps():
return frappe.get_all_apps(with_internal_apps=False, sites_path=".")
if __name__ == "__main__":
if not frappe._dev_server:
warnings.simplefilter("ignore")
main()