Merge branch 'master' into derek-moore-bug405_email_notifications_for_comments
[mediagoblin.git] / mediagoblin / gmg_commands / shell.py
1 # GNU MediaGoblin -- federated, autonomous media hosting
2 # Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
3 #
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU Affero General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU Affero General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
17
18 import code
19
20 from mediagoblin import mg_globals
21 from mediagoblin.gmg_commands import util as commands_util
22
23
24 def shell_parser_setup(subparser):
25 subparser.add_argument(
26 '--ipython', help='Use ipython',
27 action="store_true")
28
29
30 SHELL_BANNER = """\
31 GNU MediaGoblin shell!
32 ----------------------
33 Available vars:
34 - mgoblin_app: instantiated mediagoblin application
35 - mg_globals: mediagoblin.globals
36 - db: database instance
37 """
38
39 def py_shell(**user_namespace):
40 """
41 Run a shell using normal python shell.
42 """
43 code.interact(
44 banner=SHELL_BANNER,
45 local=user_namespace)
46
47
48 def ipython_shell(**user_namespace):
49 """
50 Run a shell for the user using ipython.
51 """
52 try:
53 from IPython import embed
54 except:
55 print "IPython not available... exiting!"
56 return
57
58 embed(
59 banner1=SHELL_BANNER,
60 user_ns=user_namespace)
61
62
63 def shell(args):
64 """
65 Setup a shell for the user
66 either a normal Python shell
67 or an IPython one
68 """
69 user_namespace = {
70 'mg_globals': mg_globals,
71 'mgoblin_app': commands_util.setup_app(args),
72 'db': mg_globals.database}
73
74 if args.ipython:
75 ipython_shell(**user_namespace)
76 else:
77 py_shell(**user_namespace)