Package gluon :: Module shell
[hide private]
[frames] | no frames]

Source Code for Module gluon.shell

  1  #   Programmer: limodou 
  2  #   E-mail:     limodou@gmail.com 
  3  # 
  4  #   Copyleft 2008 limodou 
  5  # 
  6  #   Distributed under the terms of the BSD license. 
  7   
  8  import os, sys 
  9  from optparse import OptionParser 
 10   
11 -def env(app, dir='', import_models=False):
12 import gluon.html as html 13 import gluon.validators as validators 14 from gluon.http import HTTP, redirect 15 from gluon.languages import translator 16 from gluon.cache import Cache 17 from gluon.globals import Request, Response, Session 18 from gluon.sql import SQLDB, SQLField 19 from gluon.sqlhtml import SQLFORM, SQLTABLE 20 21 request=Request() 22 response=Response() 23 session=Session() 24 25 if not dir: 26 request.folder = os.path.join('applications', app) 27 else: 28 request.folder = dir 29 30 environment={} 31 for key in html.__all__: environment[key]=eval('html.%s' % key) 32 for key in validators.__all__: environment[key]=eval('validators.%s' % key) 33 environment['T']=translator(request) 34 environment['HTTP']=HTTP 35 environment['redirect']=redirect 36 environment['request']=request 37 environment['response']=response 38 environment['session']=session 39 environment['cache']=Cache(request) 40 environment['SQLDB']=SQLDB 41 SQLDB._set_thread_folder(os.path.join(request.folder,'databases')) 42 environment['SQLField']=SQLField 43 environment['SQLFORM']=SQLFORM 44 environment['SQLTABLE']=SQLTABLE 45 46 if import_models: 47 model_path = os.path.join(request.folder,'models', '*.py') 48 from glob import glob 49 for f in glob(model_path): 50 fname, ext = os.path.splitext(f) 51 execfile(f, environment) 52 # print 'Imported "%s" model file' % fname 53 54 return environment
55
56 -def run(appname, plain=False, import_models=False, startfile=None):
57 from gluon.fileutils import untar 58 59 path=os.path.join('applications',appname) 60 if not os.access(path,os.F_OK): 61 if raw_input('application %s does not exit, create (y/n)?' % appname).lower() in ['y','yes']: 62 os.mkdir(path) 63 untar('welcome.tar',path) 64 else: return 65 66 _env = env(appname, import_models) 67 68 if startfile: 69 pythonrc = os.environ.get("PYTHONSTARTUP") 70 if pythonrc and os.path.isfile(pythonrc): 71 try: 72 execfile(pythonrc) 73 except NameError: 74 pass 75 execfile(startfile, {}, _env) 76 else: 77 if not plain: 78 try: 79 import IPython 80 shell = IPython.Shell.IPShell(argv=[], user_ns=_env) 81 shell.mainloop() 82 return 83 except: 84 print 'error: Import IPython error, please check you installed IPython'\ 85 ' correctly, and use default python shell.' 86 87 import code 88 try: 89 import readline 90 except ImportError: 91 pass 92 else: 93 import rlcompleter 94 readline.set_completer(rlcompleter.Completer(_env).complete) 95 readline.parse_and_bind("tab:complete") 96 97 pythonrc = os.environ.get("PYTHONSTARTUP") 98 if pythonrc and os.path.isfile(pythonrc): 99 try: 100 execfile(pythonrc) 101 except NameError: 102 pass 103 code.interact(local=_env)
104
105 -def get_usage():
106 usage = """ 107 %prog [options] pythonfile 108 """ 109 return usage
110
111 -def execute_from_command_line(argv=None):
112 if argv is None: 113 argv = sys.argv 114 115 parser = OptionParser(usage=get_usage()) 116 117 parser.add_option('-S', '--shell', 118 dest='shell', metavar='APPNAME', 119 help='run web2py in interactive shell or IPython(if installed) with specified appname') 120 parser.add_option('-P', '--plain', action='store_true', default=False, 121 dest='plain', 122 help='only use plain python shell, should be used with --shell option') 123 parser.add_option('-M', '--import_models', action='store_true', default=False, 124 dest='import_models', 125 help='auto import model files, default is False, should be used with --shell option') 126 parser.add_option('-R', '--run', dest='run', metavar='PYTHON_FILE', default='', 127 help='run PYTHON_FILE in web2py environment, should be used with --shell option') 128 129 options, args = parser.parse_args(argv[1:]) 130 131 if len(sys.argv) == 1: 132 parser.print_help() 133 sys.exit(0) 134 135 if len(args) > 0: 136 startfile = args[0] 137 else: 138 sstartfile = '' 139 run(options.shell, options.plain, startfile=startfile)
140 141 if __name__ == '__main__': 142 execute_from_command_line() 143