Esempio n. 1
0
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"],
    )
Esempio n. 2
0
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'))
Esempio n. 3
0
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
Esempio n. 4
0
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)
Esempio n. 5
0
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"],
        )