from __future__ import unicode_literals, print_function import click import frappe import os import json import importlib import frappe.utils import traceback 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.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__": main()