view MoinMoin/script/maint/ @ 1020:2c4087f61d39

add a new moin command called moinshell, that runs a python shell with preseted flaskg variables
author Fabio Montefuscolo <>
date Sat, 29 Oct 2011 18:45:40 -0200
children 1f3d66455a88
line wrap: on
line source
# -*- coding: utf-8 -*-

from flask import Flask, _request_ctx_stack
from flask import current_app as app
from flask import g as flaskg
from flaskext.script import Command, Option

from MoinMoin import user
from MoinMoin.util.clock import Clock

class MoinShell(Command):

    Runs a Python shell inside Flask application context.

    :param banner: banner appearing at top of shell when started
    :param make_context: a callable returning a dict of variables 
                         used in the shell namespace. By default 
                         returns a dict consisting of just the app.
    :param use_ipython: use IPython shell if available, ignore if not. 
                        The IPython shell can be turned off in command 
                        line by passing the **--no-ipython** flag.

    banner = ''

    description = 'Runs a Python shell inside Flask application context.'
    def __init__(self, banner=None, make_context=None, use_ipython=True):

        self.banner = banner or self.banner
        self.use_ipython = use_ipython

        if make_context is None:
            def make_context():
                app =
                flaskg.unprotected_storage =
                flaskg.groups = app.cfg.groups()
                flaskg.user = user.User()
                flaskg.clock = Clock()
                return dict(app=app, flaskg=flaskg)

        self.make_context = make_context
    def get_options(self):

        return (

    def get_context(self):
        Returns a dict of context variables added to the shell namespace.

        return self.make_context()

    def run(self, no_ipython):

        Runs the shell. Unless no_ipython is True or use_python is False
        then runs IPython shell if that is installed.

        context = self.get_context()

        from IPython import embed