Context objects now use a contextmanager (and update gmg shell to use it)

This means that we have a really convenient way to make sure that you
have a context/request that threads its way through the application,
where everything needed gets "shut down" appropriately by the end.

You always get a context object via a context manager!  And by the time
you're done with it, things should be cleaned up.
This commit is contained in:
Christopher Allan Webber
2014-11-30 16:14:05 -06:00
parent 9d82dff6fb
commit a4768df0ca
2 changed files with 24 additions and 17 deletions

View File

@@ -35,7 +35,8 @@ if DISABLE_GLOBALS:
"----------------------\n"
"Available vars:\n"
" - app: instantiated mediagoblin application\n"
" - db: database session\n")
" - db: database session\n"
" - ctx: context object\n")
else:
SHELL_BANNER = (
"GNU MediaGoblin shell!\n"
@@ -43,7 +44,8 @@ else:
"Available vars:\n"
" - app: instantiated mediagoblin application\n"
" - mg_globals: mediagoblin.globals\n"
" - db: database instance\n")
" - db: database instance\n"
" - ctx: context object\n")
def py_shell(**user_namespace):
"""
@@ -75,11 +77,12 @@ def shell(args):
"""
app = commands_util.setup_app(args)
def run_shell(db):
def run_shell(db, ctx):
user_namespace = {
'mg_globals': mg_globals,
'app': app,
'db': db}
'db': db,
"ctx": ctx}
if args.ipython:
ipython_shell(**user_namespace)
@@ -88,8 +91,6 @@ def shell(args):
if not ipython_shell(**user_namespace):
py_shell(**user_namespace)
if DISABLE_GLOBALS:
with app.db_manager.session_scope() as db:
run_shell(db)
else:
run_shell(mg_globals.database)
with app.gen_context() as ctx:
db = ctx.db
run_shell(db, ctx)