NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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