script.py (6077B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\lib\werkzeug\script.py 2 import sys 3 import inspect 4 import getopt 5 from os.path import basename 6 argument_types = {bool: 'boolean', 7 str: 'string', 8 int: 'integer', 9 float: 'float'} 10 converters = {'boolean': lambda x: x.lower() in ('1', 'true', 'yes', 'on'), 11 'string': str, 12 'integer': int, 13 'float': float} 14 15 def run(namespace = None, action_prefix = 'action_', args = None): 16 if namespace is None: 17 namespace = sys._getframe(1).f_locals 18 actions = find_actions(namespace, action_prefix) 19 if args is None: 20 args = sys.argv[1:] 21 if not args or args[0] in ('-h', '--help'): 22 return print_usage(actions) 23 if args[0] not in actions: 24 fail("Unknown action '%s'" % args[0]) 25 arguments = {} 26 types = {} 27 key_to_arg = {} 28 long_options = [] 29 formatstring = '' 30 func, doc, arg_def = actions[args.pop(0)] 31 for idx, (arg, shortcut, default, option_type) in enumerate(arg_def): 32 real_arg = arg.replace('-', '_') 33 if shortcut: 34 formatstring += shortcut 35 if not isinstance(default, bool): 36 formatstring += ':' 37 key_to_arg['-' + shortcut] = real_arg 38 long_options.append(isinstance(default, bool) and arg or arg + '=') 39 key_to_arg['--' + arg] = real_arg 40 key_to_arg[idx] = real_arg 41 types[real_arg] = option_type 42 arguments[real_arg] = default 43 44 try: 45 optlist, posargs = getopt.gnu_getopt(args, formatstring, long_options) 46 except getopt.GetoptError as e: 47 fail(str(e)) 48 49 specified_arguments = set() 50 for key, value in enumerate(posargs): 51 try: 52 arg = key_to_arg[key] 53 except IndexError: 54 fail('Too many parameters') 55 56 specified_arguments.add(arg) 57 try: 58 arguments[arg] = converters[types[arg]](value) 59 except ValueError: 60 fail('Invalid value for argument %s (%s): %s' % (key, arg, value)) 61 62 for key, value in optlist: 63 arg = key_to_arg[key] 64 if arg in specified_arguments: 65 fail("Argument '%s' is specified twice" % arg) 66 if types[arg] == 'boolean': 67 if arg.startswith('no_'): 68 value = 'no' 69 else: 70 value = 'yes' 71 try: 72 arguments[arg] = converters[types[arg]](value) 73 except ValueError: 74 fail("Invalid value for '%s': %s" % (key, value)) 75 76 newargs = {} 77 for k, v in arguments.iteritems(): 78 newargs[k.startswith('no_') and k[3:] or k] = v 79 80 arguments = newargs 81 return func(**arguments) 82 83 84 def fail(message, code = -1): 85 print >> sys.stderr, 'Error:', message 86 sys.exit(code) 87 88 89 def find_actions(namespace, action_prefix): 90 actions = {} 91 for key, value in namespace.iteritems(): 92 if key.startswith(action_prefix): 93 actions[key[len(action_prefix):]] = analyse_action(value) 94 95 return actions 96 97 98 def print_usage(actions): 99 actions = actions.items() 100 actions.sort() 101 print 'usage: %s <action> [<options>]' % basename(sys.argv[0]) 102 print ' %s --help' % basename(sys.argv[0]) 103 print 104 print 'actions:' 105 for name, (func, doc, arguments) in actions: 106 print ' %s:' % name 107 for line in doc.splitlines(): 108 print ' %s' % line 109 110 if arguments: 111 print 112 for arg, shortcut, default, argtype in arguments: 113 if isinstance(default, bool): 114 print ' %s' % ((shortcut and '-%s, ' % shortcut or '') + '--' + arg) 115 else: 116 print ' %-30s%-10s%s' % ((shortcut and '-%s, ' % shortcut or '') + '--' + arg, argtype, default) 117 118 print 119 120 121 def analyse_action(func): 122 description = inspect.getdoc(func) or 'undocumented action' 123 arguments = [] 124 args, varargs, kwargs, defaults = inspect.getargspec(func) 125 if varargs or kwargs: 126 raise TypeError('variable length arguments for action not allowed.') 127 if len(args) != len(defaults or ()): 128 raise TypeError('not all arguments have proper definitions') 129 for idx, (arg, definition) in enumerate(zip(args, defaults or ())): 130 if arg.startswith('_'): 131 raise TypeError('arguments may not start with an underscore') 132 if not isinstance(definition, tuple): 133 shortcut = None 134 default = definition 135 else: 136 shortcut, default = definition 137 argument_type = argument_types[type(default)] 138 if isinstance(default, bool) and default is True: 139 arg = 'no-' + arg 140 arguments.append((arg.replace('_', '-'), 141 shortcut, 142 default, 143 argument_type)) 144 145 return (func, description, arguments) 146 147 148 def make_shell(init_func = None, banner = None, use_ipython = True): 149 if banner is None: 150 banner = 'Interactive Werkzeug Shell' 151 if init_func is None: 152 init_func = dict 153 154 def action(ipython = use_ipython): 155 namespace = init_func() 156 if ipython: 157 try: 158 import IPython 159 except ImportError: 160 pass 161 else: 162 sh = IPython.Shell.IPShellEmbed(banner=banner) 163 sh(global_ns={}, local_ns=namespace) 164 return 165 166 from code import interact 167 interact(banner, local=namespace) 168 169 return action 170 171 172 def make_runserver(app_factory, hostname = 'localhost', port = 5000, use_reloader = False, use_debugger = False, use_evalex = True, threaded = False, processes = 1, static_files = None, extra_files = None, ssl_context = None): 173 174 def action(hostname = ('h', hostname), port = ('p', port), reloader = use_reloader, debugger = use_debugger, evalex = use_evalex, threaded = threaded, processes = processes): 175 from werkzeug.serving import run_simple 176 app = app_factory() 177 run_simple(hostname, port, app, reloader, debugger, evalex, extra_files, 1, threaded, processes, static_files=static_files, ssl_context=ssl_context) 178 179 return action