def cli(): """An improved shell command, based on konch.""" from flask.globals import _app_ctx_stack app = _app_ctx_stack.top.app options = {key: app.config.get(key, DEFAULTS[key]) for key in DEFAULTS.keys()} base_context = {"app": app} if options["KONCH_FLASK_IMPORTS"]: base_context.update(get_flask_imports()) context = dict(base_context) if options["KONCH_FLASK_SHELL_CONTEXT"]: flask_context = app.make_shell_context() context.update(flask_context) context.update(options["KONCH_CONTEXT"]) def context_formatter(ctx): formatted_base = ", ".join(sorted(base_context.keys())) ret = "\n{FLASK}\n{base_context}\n".format( FLASK=click.style("Flask:", bold=True), base_context=formatted_base ) if options["KONCH_FLASK_SHELL_CONTEXT"]: variables = ", ".join(sorted(flask_context.keys())) ret += "\n{ADDITIONAL}\n{variables}\n".format( ADDITIONAL=click.style( "Flask shell context (see shell_context_processor()):", bold=True ), variables=variables, ) if options["KONCH_CONTEXT"]: variables = ", ".join(sorted(options["KONCH_CONTEXT"].keys())) ret += "\n{ADDITIONAL}\n{variables}".format( ADDITIONAL=click.style( "Additional variables (see KONCH_CONTEXT):", bold=True ), variables=variables, ) return ret context_format = options["KONCH_CONTEXT_FORMAT"] or context_formatter konch.start( context=context, shell=options["KONCH_SHELL"], banner=options["KONCH_BANNER"], prompt=options["KONCH_PROMPT"], output=options["KONCH_OUTPUT"], ptpy_vi_mode=options["KONCH_PTPY_VI_MODE"], context_format=context_format, ipy_extensions=options["KONCH_IPY_EXTENSIONS"], ipy_autoreload=options["KONCH_IPY_AUTORELOAD"], ipy_colors=options["KONCH_IPY_COLORS"], ipy_highlighting_style=options["KONCH_IPY_HIGHLIGHTING_STYLE"], )
def shell(): '''Start a shell in the app context.''' def context_format(ctx): return fill(', '.join(sorted(ctx.keys())), 96) def shell_echo(*args): print(f'{echo("", "", *args, _print=False)}\n') import junior import readline import rlcompleter # noqa from flask.globals import _app_ctx_stack app = _app_ctx_stack.top.app shell_context = {'app': app} imports = ('Application', 'Blueprint', 'Flask', 'Message', 'Model', 'Path', 'Request', 'Resource', 'Response', 'User', 'X', '_', 'api', 'b', 'cache', 'components', 'config', 'context', 'db', 'debug', 'dt', 'env', 'error', 'flatten', 'join', 'jsonify', 'mail', 'model', 'path', 'queue', 'redirect', 'render', 'resource', 'response', 'schemas', 'split', 'store', 'td', 'timestamps', 'web') for name in imports: shell_context[name] = getattr(junior, name) shell_context.update(app.make_shell_context()) shell_context['echo'] = shell_echo shell_context['now'] = dt.now banner = app.name if config.name != app.name: banner = f'{config.name} :: {app.name}' banner = click.style(banner, fg='bright_green', bold=True) banner = f'{banner}\n{click.style(app.env, fg="bright_blue")}\n' readline.parse_and_bind('tab: complete') readline.read_history_file(join(env.cache_path, 'history')) konch.start(shell='auto', context=shell_context, context_format=context_format, banner=banner) readline.write_history_file(join(env.cache_path, 'history'))
def start_konch( rc: typing.Union[Path, None] = None, konch_args: typing.Union[typing.Sequence[typing.Any], None] = None, ) -> None: """Start konch, optionally specify rc file.""" rc = find_rc_file(rc) touch_files() konch.logger = logger if rc is None: logger.info("Config file not found.") konch.main(konch_args) else: konchrc = konch.use_file(rc, trust=True) DBG(dir(konchrc)) DBG(f"{dir(konchrc.konch)}") DBG(f"konch_args: {konch_args}") konch.start(konch_args) return
def cli(shell: str, sqlalchemy_echo: bool): """An improved Flask shell command.""" from flask.globals import _app_ctx_stack app = _app_ctx_stack.top.app options = {key: app.config.get(key, DEFAULTS[key]) for key in DEFAULTS} app.config["SQLALCHEMY_ECHO"] = sqlalchemy_echo base_context = {"app": app} flask_context = app.make_shell_context() schema_context = get_schema_context() context = dict(base_context) model_context = get_models_context(app) settings_context = options["RESTY_SHELL_CONTEXT"] def context_formatter(full_context: dict): """Flask-RESTy-specific context formatter. Groups objects into sections with a bold header for each. """ sections = [("Flask", flask_context)] if schema_context: sections.append(("Schemas", schema_context)) if model_context: sections.append(("Models", model_context)) additional_context_keys = (full_context.keys() - flask_context.keys() - schema_context.keys() - model_context.keys()) additional_context = { key: full_context[key] for key in additional_context_keys } if additional_context: sections.append(("Additional", additional_context)) return "\n".join([format_section(*section) for section in sections]) context = { **flask_context, **schema_context, **model_context, **settings_context, } context_format = options["RESTY_SHELL_CONTEXT_FORMAT"] or context_formatter banner = get_banner(app, logo=options["RESTY_SHELL_LOGO"]) # Use singleton _cfg to allow overrides in .konchrc.local config = konch._cfg config.update( dict( context=context, context_format=context_format, banner=banner, shell=shell, prompt=options["RESTY_SHELL_PROMPT"], output=options["RESTY_SHELL_OUTPUT"], ptpy_vi_mode=options["RESTY_SHELL_PTPY_VI_MODE"], ipy_extensions=options["RESTY_SHELL_IPY_EXTENSIONS"], ipy_autoreload=options["RESTY_SHELL_IPY_AUTORELOAD"], ipy_colors=options["RESTY_SHELL_IPY_COLORS"], ipy_highlighting_style=options[ "RESTY_SHELL_IPY_HIGHLIGHTING_STYLE"], )) if Path(".konchrc.local").exists(): # pragma: no cover konch.use_file(".konchrc.local", trust=True) konch.start(**config)
def console(): import flask from flask.globals import _app_ctx_stack from flask.cli import with_appcontext import click DEFAULTS = dict( KONCH_FLASK_IMPORTS=True, KONCH_FLASK_SHELL_CONTEXT=True, KONCH_CONTEXT={}, KONCH_SHELL="auto", KONCH_BANNER=None, KONCH_PROMPT=None, KONCH_OUTPUT=None, KONCH_CONTEXT_FORMAT=None, KONCH_IPY_AUTORELOAD=False, KONCH_IPY_EXTENSIONS=None, KONCH_IPY_COLORS=None, KONCH_IPY_HIGHLIGHTING_STYLE=None, KONCH_PTPY_VI_MODE=False, ) def get_flask_imports(): ret = {} for name in [e for e in dir(flask) if not e.startswith("_")]: ret[name] = getattr(flask, name) return ret with dev_app.app_context(): app = _app_ctx_stack.top.app options = { key: app.config.get(key, DEFAULTS[key]) for key in DEFAULTS.keys() } base_context = {"app": dev_app} if options["KONCH_FLASK_IMPORTS"]: base_context.update(get_flask_imports()) context = dict(base_context) if options["KONCH_FLASK_SHELL_CONTEXT"]: flask_context = app.make_shell_context() context.update(flask_context) context.update(options["KONCH_CONTEXT"]) def context_formatter(ctx): formatted_base = ", ".join(sorted(base_context.keys())) ret = "\n{FLASK}\n{base_context}\n".format( FLASK=click.style("Flask:", bold=True), base_context=formatted_base) if options["KONCH_FLASK_SHELL_CONTEXT"]: variables = ", ".join(sorted(flask_context.keys())) ret += "\n{ADDITIONAL}\n{variables}\n".format( ADDITIONAL=click.style( "Flask shell context (see shell_context_processor()):", bold=True), variables=variables, ) if options["KONCH_CONTEXT"]: variables = ", ".join(sorted(options["KONCH_CONTEXT"].keys())) ret += "\n{ADDITIONAL}\n{variables}".format( ADDITIONAL=click.style( "Additional variables (see KONCH_CONTEXT):", bold=True), variables=variables, ) return ret context_format = options["KONCH_CONTEXT_FORMAT"] or context_formatter konch.start( context=context, shell=options["KONCH_SHELL"], banner=options["KONCH_BANNER"], prompt=options["KONCH_PROMPT"], output=options["KONCH_OUTPUT"], ptpy_vi_mode=options["KONCH_PTPY_VI_MODE"], context_format=context_format, ipy_extensions=options["KONCH_IPY_EXTENSIONS"], ipy_autoreload=options["KONCH_IPY_AUTORELOAD"], ipy_colors=options["KONCH_IPY_COLORS"], ipy_highlighting_style=options["KONCH_IPY_HIGHLIGHTING_STYLE"], )