| Index: third_party/twisted_8_1/twisted/python/zshcomp.py
|
| diff --git a/third_party/twisted_8_1/twisted/python/zshcomp.py b/third_party/twisted_8_1/twisted/python/zshcomp.py
|
| deleted file mode 100644
|
| index 4910cfd59f456e6ac1202443317c3d6c5a9eadcf..0000000000000000000000000000000000000000
|
| --- a/third_party/twisted_8_1/twisted/python/zshcomp.py
|
| +++ /dev/null
|
| @@ -1,780 +0,0 @@
|
| -# -*- test-case-name: twisted.test.test_zshcomp -*-
|
| -# Copyright (c) 2006 Twisted Matrix Laboratories.
|
| -# See LICENSE for details.
|
| -
|
| -"""
|
| -Rebuild the completion functions for the currently active version of Twisted::
|
| - $ python zshcomp.py -i
|
| -
|
| -This module implements a zsh code generator which generates completion code for
|
| -commands that use twisted.python.usage. This is the stuff that makes pressing
|
| -Tab at the command line work.
|
| -
|
| -Maintainer: Eric Mangold
|
| -
|
| -To build completion functions for your own commands, and not Twisted commands,
|
| -then just do something like this::
|
| -
|
| - o = mymodule.MyOptions()
|
| - f = file('_mycommand', 'w')
|
| - Builder("mycommand", o, f).write()
|
| -
|
| -Then all you have to do is place the generated file somewhere in your
|
| -C{$fpath}, and restart zsh. Note the "site-functions" directory in your
|
| -C{$fpath} where you may install 3rd-party completion functions (like the one
|
| -you're building). Call C{siteFunctionsPath} to locate this directory
|
| -programmatically.
|
| -
|
| -SPECIAL CLASS VARIABLES. You may set these on your usage.Options subclass::
|
| -
|
| - zsh_altArgDescr
|
| - zsh_multiUse
|
| - zsh_mutuallyExclusive
|
| - zsh_actions
|
| - zsh_actionDescr
|
| - zsh_extras
|
| -
|
| -Here is what they mean (with examples)::
|
| -
|
| - zsh_altArgDescr = {"foo":"use this description for foo instead"}
|
| - A dict mapping long option names to alternate descriptions. When this
|
| - variable is present, the descriptions contained here will override
|
| - those descriptions provided in the optFlags and optParameters
|
| - variables.
|
| -
|
| - zsh_multiUse = ["foo", "bar"]
|
| - A sequence containing those long option names which may appear on the
|
| - command line more than once. By default, options will only be completed
|
| - one time.
|
| -
|
| - zsh_mutuallyExclusive = [("foo", "bar"), ("bar", "baz")]
|
| - A sequence of sequences, with each sub-sequence containing those long
|
| - option names that are mutually exclusive. That is, those options that
|
| - cannot appear on the command line together.
|
| -
|
| - zsh_actions = {"foo":'_files -g "*.foo"', "bar":"(one two three)",
|
| - "colors":"_values -s , 'colors to use' red green blue"}
|
| - A dict mapping long option names to Zsh "actions". These actions
|
| - define what will be completed as the argument to the given option. By
|
| - default, all files/dirs will be completed if no action is given.
|
| -
|
| - Callables may instead be given for the values in this dict. The
|
| - callable should accept no arguments, and return a string that will be
|
| - used as the zsh "action" in the same way as the literal strings in the
|
| - examples above.
|
| -
|
| - As you can see in the example above. The "foo" option will have files
|
| - that end in .foo completed when the user presses Tab. The "bar"
|
| - option will have either of the strings "one", "two", or "three"
|
| - completed when the user presses Tab.
|
| -
|
| - "colors" will allow multiple arguments to be completed, seperated by
|
| - commas. The possible arguments are red, green, and blue. Examples::
|
| -
|
| - my_command --foo some-file.foo --colors=red,green
|
| - my_command --colors=green
|
| - my_command --colors=green,blue
|
| -
|
| - Actions may take many forms, and it is beyond the scope of this
|
| - document to illustrate them all. Please refer to the documention for
|
| - the Zsh _arguments function. zshcomp is basically a front-end to Zsh's
|
| - _arguments completion function.
|
| -
|
| - That documentation is available on the zsh web site at this URL:
|
| - U{http://zsh.sunsite.dk/Doc/Release/zsh_19.html#SEC124}
|
| -
|
| - zsh_actionDescr = {"logfile":"log file name", "random":"random seed"}
|
| - A dict mapping long option names to a description for the corresponding
|
| - zsh "action". These descriptions are show above the generated matches
|
| - when the user is doing completions for this option.
|
| -
|
| - Normally Zsh does not show these descriptions unless you have
|
| - "verbose" completion turned on. Turn on verbosity with this in your
|
| - ~/.zshrc::
|
| -
|
| - zstyle ':completion:*' verbose yes
|
| - zstyle ':completion:*:descriptions' format '%B%d%b'
|
| -
|
| - zsh_extras = [":file to read from:action", ":file to write to:action"]
|
| - A sequence of extra arguments that will be passed verbatim to Zsh's
|
| - _arguments completion function. The _arguments function does all the
|
| - hard work of doing command line completions. You can see how zshcomp
|
| - invokes the _arguments call by looking at the generated completion
|
| - files that this module creates.
|
| -
|
| - *** NOTE ***
|
| -
|
| - You will need to use this variable to describe completions for normal
|
| - command line arguments. That is, those arguments that are not
|
| - associated with an option. That is, the arguments that are given to the
|
| - parseArgs method of your usage.Options subclass.
|
| -
|
| - In the example above, the 1st non-option argument will be described as
|
| - "file to read from" and completion options will be generated in
|
| - accordance with the "action". (See above about zsh "actions") The
|
| - 2nd non-option argument will be described as "file to write to" and
|
| - the action will be interpreted likewise.
|
| -
|
| - Things you can put here are all documented under the _arguments
|
| - function here: U{http://zsh.sunsite.dk/Doc/Release/zsh_19.html#SEC124}
|
| -
|
| -Zsh Notes:
|
| -
|
| -To enable advanced completion add something like this to your ~/.zshrc::
|
| -
|
| - autoload -U compinit
|
| - compinit
|
| -
|
| -For some extra verbosity, and general niceness add these lines too::
|
| -
|
| - zstyle ':completion:*' verbose yes
|
| - zstyle ':completion:*:descriptions' format '%B%d%b'
|
| - zstyle ':completion:*:messages' format '%d'
|
| - zstyle ':completion:*:warnings' format 'No matches for: %d'
|
| -
|
| -Have fun!
|
| -"""
|
| -import itertools, sys, commands, os.path
|
| -
|
| -from twisted.python import reflect, util, usage
|
| -from twisted.scripts.mktap import IServiceMaker
|
| -
|
| -class MyOptions(usage.Options):
|
| - """
|
| - Options for this file
|
| - """
|
| - longdesc = ""
|
| - synopsis = "Usage: python zshcomp.py [--install | -i] | <output directory>"
|
| - optFlags = [["install", "i",
|
| - 'Output files to the "installation" directory ' \
|
| - '(twisted/python/zsh in the currently active ' \
|
| - 'Twisted package)']]
|
| - optParameters = [["directory", "d", None,
|
| - "Output files to this directory"]]
|
| - def postOptions(self):
|
| - if self['install'] and self['directory']:
|
| - raise usage.UsageError, "Can't have --install and " \
|
| - "--directory at the same time"
|
| - if not self['install'] and not self['directory']:
|
| - raise usage.UsageError, "Not enough arguments"
|
| - if self['directory'] and not os.path.isdir(self['directory']):
|
| - raise usage.UsageError, "%s is not a directory" % self['directory']
|
| -
|
| -class Builder:
|
| - def __init__(self, cmd_name, options, file):
|
| - """
|
| - @type cmd_name: C{str}
|
| - @param cmd_name: The name of the command
|
| -
|
| - @type options: C{twisted.usage.Options}
|
| - @param options: The C{twisted.usage.Options} instance defined for
|
| - this command
|
| -
|
| - @type file: C{file}
|
| - @param file: The C{file} to write the completion function to
|
| - """
|
| -
|
| - self.cmd_name = cmd_name
|
| - self.options = options
|
| - self.file = file
|
| -
|
| - def write(self):
|
| - """
|
| - Write the completion function to the file given to __init__
|
| - @return: C{None}
|
| - """
|
| - # by default, we just write out a single call to _arguments
|
| - self.file.write('#compdef %s\n' % (self.cmd_name,))
|
| - gen = ArgumentsGenerator(self.cmd_name, self.options, self.file)
|
| - gen.write()
|
| -
|
| -class SubcommandBuilder(Builder):
|
| - """
|
| - Use this builder for commands that have sub-commands. twisted.python.usage
|
| - has the notion of sub-commands that are defined using an entirely seperate
|
| - Options class.
|
| - """
|
| - interface = None
|
| - subcmdLabel = None
|
| -
|
| - def write(self):
|
| - """
|
| - Write the completion function to the file given to __init__
|
| - @return: C{None}
|
| - """
|
| - self.file.write('#compdef %s\n' % (self.cmd_name,))
|
| - self.file.write('local _zsh_subcmds_array\n_zsh_subcmds_array=(\n')
|
| - from twisted import plugin as newplugin
|
| - plugins = newplugin.getPlugins(self.interface)
|
| -
|
| - for p in plugins:
|
| - self.file.write('"%s:%s"\n' % (p.tapname, p.description))
|
| - self.file.write(")\n\n")
|
| -
|
| - self.options.__class__.zsh_extras = ['*::subcmd:->subcmd']
|
| - gen = ArgumentsGenerator(self.cmd_name, self.options, self.file)
|
| - gen.write()
|
| -
|
| - self.file.write("""if (( CURRENT == 1 )); then
|
| - _describe "%s" _zsh_subcmds_array && ret=0
|
| -fi
|
| -(( ret )) || return 0
|
| -
|
| -service="$words[1]"
|
| -
|
| -case $service in\n""" % (self.subcmdLabel,))
|
| -
|
| - plugins = newplugin.getPlugins(self.interface)
|
| - for p in plugins:
|
| - self.file.write(p.tapname + ")\n")
|
| - gen = ArgumentsGenerator(p.tapname, p.options(), self.file)
|
| - gen.write()
|
| - self.file.write(";;\n")
|
| - self.file.write("*) _message \"don't know how to" \
|
| - " complete $service\";;\nesac")
|
| -
|
| -class MktapBuilder(SubcommandBuilder):
|
| - """
|
| - Builder for the mktap command
|
| - """
|
| - interface = IServiceMaker
|
| - subcmdLabel = 'tap to build'
|
| -
|
| -class TwistdBuilder(SubcommandBuilder):
|
| - """
|
| - Builder for the twistd command
|
| - """
|
| - interface = IServiceMaker
|
| - subcmdLabel = 'service to run'
|
| -
|
| -class ArgumentsGenerator:
|
| - """
|
| - Generate a call to the zsh _arguments completion function
|
| - based on data in a usage.Options subclass
|
| - """
|
| - def __init__(self, cmd_name, options, file):
|
| - """
|
| - @type cmd_name: C{str}
|
| - @param cmd_name: The name of the command
|
| -
|
| - @type options: C{twisted.usage.Options}
|
| - @param options: The C{twisted.usage.Options} instance defined
|
| - for this command
|
| -
|
| - @type file: C{file}
|
| - @param file: The C{file} to write the completion function to
|
| - """
|
| - self.cmd_name = cmd_name
|
| - self.options = options
|
| - self.file = file
|
| -
|
| - self.altArgDescr = {}
|
| - self.actionDescr = {}
|
| - self.multiUse = []
|
| - self.mutuallyExclusive = []
|
| - self.actions = {}
|
| - self.extras = []
|
| -
|
| - aCL = reflect.accumulateClassList
|
| - aCD = reflect.accumulateClassDict
|
| -
|
| - aCD(options.__class__, 'zsh_altArgDescr', self.altArgDescr)
|
| - aCD(options.__class__, 'zsh_actionDescr', self.actionDescr)
|
| - aCL(options.__class__, 'zsh_multiUse', self.multiUse)
|
| - aCL(options.__class__, 'zsh_mutuallyExclusive',
|
| - self.mutuallyExclusive)
|
| - aCD(options.__class__, 'zsh_actions', self.actions)
|
| - aCL(options.__class__, 'zsh_extras', self.extras)
|
| -
|
| - optFlags = []
|
| - optParams = []
|
| -
|
| - aCL(options.__class__, 'optFlags', optFlags)
|
| - aCL(options.__class__, 'optParameters', optParams)
|
| -
|
| - for i, optList in enumerate(optFlags):
|
| - if len(optList) != 3:
|
| - optFlags[i] = util.padTo(3, optList)
|
| -
|
| - for i, optList in enumerate(optParams):
|
| - if len(optList) != 4:
|
| - optParams[i] = util.padTo(4, optList)
|
| -
|
| -
|
| - self.optFlags = optFlags
|
| - self.optParams = optParams
|
| -
|
| - optParams_d = {}
|
| - for optList in optParams:
|
| - optParams_d[optList[0]] = optList[1:]
|
| - self.optParams_d = optParams_d
|
| -
|
| - optFlags_d = {}
|
| - for optList in optFlags:
|
| - optFlags_d[optList[0]] = optList[1:]
|
| - self.optFlags_d = optFlags_d
|
| -
|
| - optAll_d = {}
|
| - optAll_d.update(optParams_d)
|
| - optAll_d.update(optFlags_d)
|
| - self.optAll_d = optAll_d
|
| -
|
| - self.addAdditionalOptions()
|
| -
|
| - # makes sure none of the zsh_ data structures reference option
|
| - # names that don't exist. (great for catching typos)
|
| - self.verifyZshNames()
|
| -
|
| - self.excludes = self.makeExcludesDict()
|
| -
|
| - def write(self):
|
| - """
|
| - Write the zsh completion code to the file given to __init__
|
| - @return: C{None}
|
| - """
|
| - self.writeHeader()
|
| - self.writeExtras()
|
| - self.writeOptions()
|
| - self.writeFooter()
|
| -
|
| - def writeHeader(self):
|
| - """
|
| - This is the start of the code that calls _arguments
|
| - @return: C{None}
|
| - """
|
| - self.file.write('_arguments -s -A "-*" \\\n')
|
| -
|
| - def writeOptions(self):
|
| - """
|
| - Write out zsh code for each option in this command
|
| - @return: C{None}
|
| - """
|
| - optNames = self.optAll_d.keys()
|
| - optNames.sort()
|
| - for long in optNames:
|
| - self.writeOpt(long)
|
| -
|
| - def writeExtras(self):
|
| - """
|
| - Write out the "extras" list. These are just passed verbatim to the
|
| - _arguments call
|
| - @return: C{None}
|
| - """
|
| - for s in self.extras:
|
| - self.file.write(escape(s))
|
| - self.file.write(' \\\n')
|
| -
|
| - def writeFooter(self):
|
| - """
|
| - Write the last bit of code that finishes the call to _arguments
|
| - @return: C{None}
|
| - """
|
| - self.file.write('&& return 0\n')
|
| -
|
| - def verifyZshNames(self):
|
| - """
|
| - Ensure that none of the names given in zsh_* variables are typoed
|
| - @return: C{None}
|
| - @raise ValueError: Raised if unknown option names have been given in
|
| - zsh_* variables
|
| - """
|
| - def err(name):
|
| - raise ValueError, "Unknown option name \"%s\" found while\n" \
|
| - "examining zsh_ attributes for the %s command" % (
|
| - name, self.cmd_name)
|
| -
|
| - for name in itertools.chain(self.altArgDescr, self.actionDescr,
|
| - self.actions, self.multiUse):
|
| - if name not in self.optAll_d:
|
| - err(name)
|
| -
|
| - for seq in self.mutuallyExclusive:
|
| - for name in seq:
|
| - if name not in self.optAll_d:
|
| - err(name)
|
| -
|
| - def excludeStr(self, long, buildShort=False):
|
| - """
|
| - Generate an "exclusion string" for the given option
|
| -
|
| - @type long: C{str}
|
| - @param long: The long name of the option
|
| - (i.e. "verbose" instead of "v")
|
| -
|
| - @type buildShort: C{bool}
|
| - @param buildShort: May be True to indicate we're building an excludes
|
| - string for the short option that correspondes to
|
| - the given long opt
|
| -
|
| - @return: The generated C{str}
|
| - """
|
| - if long in self.excludes:
|
| - exclusions = self.excludes[long][:]
|
| - else:
|
| - exclusions = []
|
| -
|
| - # if long isn't a multiUse option (can't appear on the cmd line more
|
| - # than once), then we have to exclude the short option if we're
|
| - # building for the long option, and vice versa.
|
| - if long not in self.multiUse:
|
| - if buildShort is False:
|
| - short = self.getShortOption(long)
|
| - if short is not None:
|
| - exclusions.append(short)
|
| - else:
|
| - exclusions.append(long)
|
| -
|
| - if not exclusions:
|
| - return ''
|
| -
|
| - strings = []
|
| - for optName in exclusions:
|
| - if len(optName) == 1:
|
| - # short option
|
| - strings.append("-" + optName)
|
| - else:
|
| - strings.append("--" + optName)
|
| - return "(%s)" % " ".join(strings)
|
| -
|
| - def makeExcludesDict(self):
|
| - """
|
| - @return: A C{dict} that maps each option name appearing in
|
| - self.mutuallyExclusive to a list of those option names that
|
| - is it mutually exclusive with (can't appear on the cmd line with)
|
| - """
|
| -
|
| - #create a mapping of long option name -> single character name
|
| - longToShort = {}
|
| - for optList in itertools.chain(self.optParams, self.optFlags):
|
| - try:
|
| - if optList[1] != None:
|
| - longToShort[optList[0]] = optList[1]
|
| - except IndexError:
|
| - pass
|
| -
|
| - excludes = {}
|
| - for lst in self.mutuallyExclusive:
|
| - for i, long in enumerate(lst):
|
| - tmp = []
|
| - tmp.extend(lst[:i])
|
| - tmp.extend(lst[i+1:])
|
| - for name in tmp[:]:
|
| - if name in longToShort:
|
| - tmp.append(longToShort[name])
|
| -
|
| - if long in excludes:
|
| - excludes[long].extend(tmp)
|
| - else:
|
| - excludes[long] = tmp
|
| - return excludes
|
| -
|
| - def writeOpt(self, long):
|
| - """
|
| - Write out the zsh code for the given argument. This is just part of the
|
| - one big call to _arguments
|
| -
|
| - @type long: C{str}
|
| - @param long: The long name of the option
|
| - (i.e. "verbose" instead of "v")
|
| -
|
| - @return: C{None}
|
| - """
|
| - if long in self.optFlags_d:
|
| - # It's a flag option. Not one that takes a parameter.
|
| - long_field = "--%s" % long
|
| - else:
|
| - long_field = "--%s=" % long
|
| -
|
| - short = self.getShortOption(long)
|
| - if short != None:
|
| - short_field = "-" + short
|
| - else:
|
| - short_field = ''
|
| -
|
| - descr = self.getDescription(long)
|
| - descr_field = descr.replace("[", "\[")
|
| - descr_field = descr_field.replace("]", "\]")
|
| - descr_field = '[%s]' % descr_field
|
| -
|
| - if long in self.actionDescr:
|
| - actionDescr_field = self.actionDescr[long]
|
| - else:
|
| - actionDescr_field = descr
|
| -
|
| - action_field = self.getAction(long)
|
| - if long in self.multiUse:
|
| - multi_field = '*'
|
| - else:
|
| - multi_field = ''
|
| -
|
| - longExclusions_field = self.excludeStr(long)
|
| -
|
| - if short:
|
| - #we have to write an extra line for the short option if we have one
|
| - shortExclusions_field = self.excludeStr(long, buildShort=True)
|
| - self.file.write(escape('%s%s%s%s%s' % (shortExclusions_field,
|
| - multi_field, short_field, descr_field, action_field)))
|
| - self.file.write(' \\\n')
|
| -
|
| - self.file.write(escape('%s%s%s%s%s' % (longExclusions_field,
|
| - multi_field, long_field, descr_field, action_field)))
|
| - self.file.write(' \\\n')
|
| -
|
| - def getAction(self, long):
|
| - """
|
| - Return a zsh "action" string for the given argument
|
| - @return: C{str}
|
| - """
|
| - if long in self.actions:
|
| - if callable(self.actions[long]):
|
| - action = self.actions[long]()
|
| - else:
|
| - action = self.actions[long]
|
| - return ":%s:%s" % (self.getActionDescr(long), action)
|
| - if long in self.optParams_d:
|
| - return ':%s:_files' % self.getActionDescr(long)
|
| - return ''
|
| -
|
| - def getActionDescr(self, long):
|
| - """
|
| - Return the description to be used when this argument is completed
|
| - @return: C{str}
|
| - """
|
| - if long in self.actionDescr:
|
| - return self.actionDescr[long]
|
| - else:
|
| - return long
|
| -
|
| - def getDescription(self, long):
|
| - """
|
| - Return the description to be used for this argument
|
| - @return: C{str}
|
| - """
|
| - #check if we have an alternate descr for this arg, and if so use it
|
| - if long in self.altArgDescr:
|
| - return self.altArgDescr[long]
|
| -
|
| - #otherwise we have to get it from the optFlags or optParams
|
| - try:
|
| - descr = self.optFlags_d[long][1]
|
| - except KeyError:
|
| - try:
|
| - descr = self.optParams_d[long][2]
|
| - except KeyError:
|
| - descr = None
|
| -
|
| - if descr is not None:
|
| - return descr
|
| -
|
| - # lets try to get it from the opt_foo method doc string if there is one
|
| - longMangled = long.replace('-', '_') # this is what t.p.usage does
|
| - obj = getattr(self.options, 'opt_%s' % longMangled, None)
|
| - if obj:
|
| - descr = descrFromDoc(obj)
|
| - if descr is not None:
|
| - return descr
|
| -
|
| - return long # we really ought to have a good description to use
|
| -
|
| - def getShortOption(self, long):
|
| - """
|
| - Return the short option letter or None
|
| - @return: C{str} or C{None}
|
| - """
|
| - optList = self.optAll_d[long]
|
| - try:
|
| - return optList[0] or None
|
| - except IndexError:
|
| - pass
|
| -
|
| - def addAdditionalOptions(self):
|
| - """
|
| - Add additional options to the optFlags and optParams lists.
|
| - These will be defined by 'opt_foo' methods of the Options subclass
|
| - @return: C{None}
|
| - """
|
| - methodsDict = {}
|
| - reflect.accumulateMethods(self.options, methodsDict, 'opt_')
|
| - methodToShort = {}
|
| - for name in methodsDict.copy():
|
| - if len(name) == 1:
|
| - methodToShort[methodsDict[name]] = name
|
| - del methodsDict[name]
|
| -
|
| - for methodName, methodObj in methodsDict.items():
|
| - long = methodName.replace('_', '-') # t.p.usage does this
|
| - # if this option is already defined by the optFlags or
|
| - # optParameters then we don't want to override that data
|
| - if long in self.optAll_d:
|
| - continue
|
| -
|
| - descr = self.getDescription(long)
|
| -
|
| - short = None
|
| - if methodObj in methodToShort:
|
| - short = methodToShort[methodObj]
|
| -
|
| - reqArgs = methodObj.im_func.func_code.co_argcount
|
| - if reqArgs == 2:
|
| - self.optParams.append([long, short, None, descr])
|
| - self.optParams_d[long] = [short, None, descr]
|
| - self.optAll_d[long] = [short, None, descr]
|
| - elif reqArgs == 1:
|
| - self.optFlags.append([long, short, descr])
|
| - self.optFlags_d[long] = [short, descr]
|
| - self.optAll_d[long] = [short, None, descr]
|
| - else:
|
| - raise TypeError, '%r has wrong number ' \
|
| - 'of arguments' % (methodObj,)
|
| -
|
| -def descrFromDoc(obj):
|
| - """
|
| - Generate an appropriate description from docstring of the given object
|
| - """
|
| - if obj.__doc__ is None:
|
| - return None
|
| -
|
| - lines = obj.__doc__.split("\n")
|
| - descr = None
|
| - try:
|
| - if lines[0] != "" and not lines[0].isspace():
|
| - descr = lines[0].lstrip()
|
| - # skip first line if it's blank
|
| - elif lines[1] != "" and not lines[1].isspace():
|
| - descr = lines[1].lstrip()
|
| - except IndexError:
|
| - pass
|
| - return descr
|
| -
|
| -def firstLine(s):
|
| - """
|
| - Return the first line of the given string
|
| - """
|
| - try:
|
| - i = s.index('\n')
|
| - return s[:i]
|
| - except ValueError:
|
| - return s
|
| -
|
| -def escape(str):
|
| - """
|
| - Shell escape the given string
|
| - """
|
| - return commands.mkarg(str)[1:]
|
| -
|
| -def siteFunctionsPath():
|
| - """
|
| - Return the path to the system-wide site-functions directory or
|
| - C{None} if it cannot be determined
|
| - """
|
| - try:
|
| - cmd = "zsh -f -c 'echo ${(M)fpath:#/*/site-functions}'"
|
| - output = commands.getoutput(cmd)
|
| - if os.path.isdir(output):
|
| - return output
|
| - except:
|
| - pass
|
| -
|
| -generateFor = [('conch', 'twisted.conch.scripts.conch', 'ClientOptions'),
|
| - ('mktap', 'twisted.scripts.mktap', 'FirstPassOptions'),
|
| - ('trial', 'twisted.scripts.trial', 'Options'),
|
| - ('cftp', 'twisted.conch.scripts.cftp', 'ClientOptions'),
|
| - ('tapconvert', 'twisted.scripts.tapconvert', 'ConvertOptions'),
|
| - ('twistd', 'twisted.scripts.twistd', 'ServerOptions'),
|
| - ('ckeygen', 'twisted.conch.scripts.ckeygen', 'GeneralOptions'),
|
| - ('lore', 'twisted.lore.scripts.lore', 'Options'),
|
| - ('pyhtmlizer', 'twisted.scripts.htmlizer', 'Options'),
|
| - ('tap2deb', 'twisted.scripts.tap2deb', 'MyOptions'),
|
| - ('tkconch', 'twisted.conch.scripts.tkconch', 'GeneralOptions'),
|
| - ('manhole', 'twisted.scripts.manhole', 'MyOptions'),
|
| - ('tap2rpm', 'twisted.scripts.tap2rpm', 'MyOptions'),
|
| - ('websetroot', None, None),
|
| - ('tkmktap', None, None),
|
| - ]
|
| -# NOTE: the commands using None above are no longer included in Twisted.
|
| -# However due to limitations in zsh's completion system the version of
|
| -# _twisted_zsh_stub shipped with zsh contains a static list of Twisted's
|
| -# commands. It will display errors if completion functions for these missing
|
| -# commands are not found :( So we just include dummy (empty) completion
|
| -# function files
|
| -
|
| -specialBuilders = {'mktap' : MktapBuilder,
|
| - 'twistd' : TwistdBuilder}
|
| -
|
| -def makeCompFunctionFiles(out_path, generateFor=generateFor,
|
| - specialBuilders=specialBuilders):
|
| - """
|
| - Generate completion function files in the given directory for all
|
| - twisted commands
|
| -
|
| - @type out_path: C{str}
|
| - @param out_path: The path to the directory to generate completion function
|
| - fils in
|
| -
|
| - @param generateFor: Sequence in the form of the 'generateFor' top-level
|
| - variable as defined in this module. Indicates what
|
| - commands to build completion files for.
|
| -
|
| - @param specialBuilders: Sequence in the form of the 'specialBuilders'
|
| - top-level variable as defined in this module.
|
| - Indicates what commands require a special
|
| - Builder class.
|
| -
|
| - @return: C{list} of 2-tuples of the form (cmd_name, error) indicating
|
| - commands that we skipped building completions for. cmd_name
|
| - is the name of the skipped command, and error is the Exception
|
| - that was raised when trying to import the script module.
|
| - Commands are usually skipped due to a missing dependency,
|
| - e.g. Tkinter.
|
| - """
|
| - skips = []
|
| - for cmd_name, module_name, class_name in generateFor:
|
| - if module_name is None:
|
| - # create empty file
|
| - f = _openCmdFile(out_path, cmd_name)
|
| - f.close()
|
| - continue
|
| - try:
|
| - m = __import__('%s' % (module_name,), None, None, (class_name))
|
| - f = _openCmdFile(out_path, cmd_name)
|
| - o = getattr(m, class_name)() # instantiate Options class
|
| -
|
| - if cmd_name in specialBuilders:
|
| - b = specialBuilders[cmd_name](cmd_name, o, f)
|
| - b.write()
|
| - else:
|
| - b = Builder(cmd_name, o, f)
|
| - b.write()
|
| - except Exception, e:
|
| - skips.append( (cmd_name, e) )
|
| - continue
|
| - return skips
|
| -
|
| -def _openCmdFile(out_path, cmd_name):
|
| - return file(os.path.join(out_path, '_'+cmd_name), 'w')
|
| -
|
| -def run():
|
| - options = MyOptions()
|
| - try:
|
| - options.parseOptions(sys.argv[1:])
|
| - except usage.UsageError, e:
|
| - print e
|
| - print options.getUsage()
|
| - sys.exit(2)
|
| -
|
| - if options['install']:
|
| - import twisted
|
| - dir = os.path.join(os.path.dirname(twisted.__file__), "python", "zsh")
|
| - skips = makeCompFunctionFiles(dir)
|
| - else:
|
| - skips = makeCompFunctionFiles(options['directory'])
|
| -
|
| - for cmd_name, error in skips:
|
| - sys.stderr.write("zshcomp: Skipped building for %s. Script module " \
|
| - "could not be imported:\n" % (cmd_name,))
|
| - sys.stderr.write(str(error)+'\n')
|
| - if skips:
|
| - sys.exit(3)
|
| -
|
| -if __name__ == '__main__':
|
| - run()
|
|
|