| 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. Return False if there is no IPython |
| 51 | """ |
| 52 | try: |
| 53 | from IPython import embed |
| 54 | except: |
| 55 | return False |
| 56 | |
| 57 | embed( |
| 58 | banner1=SHELL_BANNER, |
| 59 | user_ns=user_namespace) |
| 60 | return True |
| 61 | |
| 62 | def shell(args): |
| 63 | """ |
| 64 | Setup a shell for the user either a normal Python shell or an IPython one |
| 65 | """ |
| 66 | user_namespace = { |
| 67 | 'mg_globals': mg_globals, |
| 68 | 'mgoblin_app': commands_util.setup_app(args), |
| 69 | 'db': mg_globals.database} |
| 70 | |
| 71 | if args.ipython: |
| 72 | ipython_shell(**user_namespace) |
| 73 | else: |
| 74 | # Try ipython_shell first and fall back if not available |
| 75 | if not ipython_shell(**user_namespace): |
| 76 | py_shell(**user_namespace) |