aboutsummaryrefslogtreecommitdiffstats
path: root/lib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/python/usage.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/python/usage.py')
-rwxr-xr-xlib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/python/usage.py973
1 files changed, 0 insertions, 973 deletions
diff --git a/lib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/python/usage.py b/lib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/python/usage.py
deleted file mode 100755
index 9280ae21..00000000
--- a/lib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/python/usage.py
+++ /dev/null
@@ -1,973 +0,0 @@
-# -*- test-case-name: twisted.test.test_usage -*-
-# Copyright (c) Twisted Matrix Laboratories.
-# See LICENSE for details.
-
-
-"""
-twisted.python.usage is a module for parsing/handling the
-command line of your program.
-
-For information on how to use it, see
-U{http://twistedmatrix.com/projects/core/documentation/howto/options.html},
-or doc/core/howto/options.xhtml in your Twisted directory.
-"""
-
-# System Imports
-import os
-import sys
-import getopt
-from os import path
-
-# Sibling Imports
-from twisted.python import reflect, text, util
-
-
-class UsageError(Exception):
- pass
-
-
-error = UsageError
-
-
-class CoerceParameter(object):
- """
- Utility class that can corce a parameter before storing it.
- """
- def __init__(self, options, coerce):
- """
- @param options: parent Options object
- @param coerce: callable used to coerce the value.
- """
- self.options = options
- self.coerce = coerce
- self.doc = getattr(self.coerce, 'coerceDoc', '')
-
- def dispatch(self, parameterName, value):
- """
- When called in dispatch, do the coerce for C{value} and save the
- returned value.
- """
- if value is None:
- raise UsageError("Parameter '%s' requires an argument."
- % (parameterName,))
- try:
- value = self.coerce(value)
- except ValueError, e:
- raise UsageError("Parameter type enforcement failed: %s" % (e,))
-
- self.options.opts[parameterName] = value
-
-
-class Options(dict):
- """
- An option list parser class
-
- C{optFlags} and C{optParameters} are lists of available parameters
- which your program can handle. The difference between the two
- is the 'flags' have an on(1) or off(0) state (off by default)
- whereas 'parameters' have an assigned value, with an optional
- default. (Compare '--verbose' and '--verbosity=2')
-
- optFlags is assigned a list of lists. Each list represents
- a flag parameter, as so::
-
- | optFlags = [['verbose', 'v', 'Makes it tell you what it doing.'],
- | ['quiet', 'q', 'Be vewy vewy quiet.']]
-
- As you can see, the first item is the long option name
- (prefixed with '--' on the command line), followed by the
- short option name (prefixed with '-'), and the description.
- The description is used for the built-in handling of the
- --help switch, which prints a usage summary.
-
- C{optParameters} is much the same, except the list also contains
- a default value::
-
- | optParameters = [['outfile', 'O', 'outfile.log', 'Description...']]
-
- A coerce function can also be specified as the last element: it will be
- called with the argument and should return the value that will be stored
- for the option. This function can have a C{coerceDoc} attribute which
- will be appended to the documentation of the option.
-
- subCommands is a list of 4-tuples of (command name, command shortcut,
- parser class, documentation). If the first non-option argument found is
- one of the given command names, an instance of the given parser class is
- instantiated and given the remainder of the arguments to parse and
- self.opts[command] is set to the command name. For example::
-
- | subCommands = [
- | ['inquisition', 'inquest', InquisitionOptions,
- | 'Perform an inquisition'],
- | ['holyquest', 'quest', HolyQuestOptions,
- | 'Embark upon a holy quest']
- | ]
-
- In this case, C{"<program> holyquest --horseback --for-grail"} will cause
- C{HolyQuestOptions} to be instantiated and asked to parse
- C{['--horseback', '--for-grail']}. Currently, only the first sub-command
- is parsed, and all options following it are passed to its parser. If a
- subcommand is found, the subCommand attribute is set to its name and the
- subOptions attribute is set to the Option instance that parses the
- remaining options. If a subcommand is not given to parseOptions,
- the subCommand attribute will be None. You can also mark one of
- the subCommands to be the default.
-
- | defaultSubCommand = 'holyquest'
-
- In this case, the subCommand attribute will never be None, and
- the subOptions attribute will always be set.
-
- If you want to handle your own options, define a method named
- C{opt_paramname} that takes C{(self, option)} as arguments. C{option}
- will be whatever immediately follows the parameter on the
- command line. Options fully supports the mapping interface, so you
- can do things like C{'self["option"] = val'} in these methods.
-
- Shell tab-completion is supported by this class, for zsh only at present.
- Zsh ships with a stub file ("completion function") which, for Twisted
- commands, performs tab-completion on-the-fly using the support provided
- by this class. The stub file lives in our tree at
- C{twisted/python/twisted-completion.zsh}, and in the Zsh tree at
- C{Completion/Unix/Command/_twisted}.
-
- Tab-completion is based upon the contents of the optFlags and optParameters
- lists. And, optionally, additional metadata may be provided by assigning a
- special attribute, C{compData}, which should be an instance of
- C{Completions}. See that class for details of what can and should be
- included - and see the howto for additional help using these features -
- including how third-parties may take advantage of tab-completion for their
- own commands.
-
- Advanced functionality is covered in the howto documentation,
- available at
- U{http://twistedmatrix.com/projects/core/documentation/howto/options.html},
- or doc/core/howto/options.xhtml in your Twisted directory.
- """
-
- subCommand = None
- defaultSubCommand = None
- parent = None
- completionData = None
- _shellCompFile = sys.stdout # file to use if shell completion is requested
- def __init__(self):
- super(Options, self).__init__()
-
- self.opts = self
- self.defaults = {}
-
- # These are strings/lists we will pass to getopt
- self.longOpt = []
- self.shortOpt = ''
- self.docs = {}
- self.synonyms = {}
- self._dispatch = {}
-
-
- collectors = [
- self._gather_flags,
- self._gather_parameters,
- self._gather_handlers,
- ]
-
- for c in collectors:
- (longOpt, shortOpt, docs, settings, synonyms, dispatch) = c()
- self.longOpt.extend(longOpt)
- self.shortOpt = self.shortOpt + shortOpt
- self.docs.update(docs)
-
- self.opts.update(settings)
- self.defaults.update(settings)
-
- self.synonyms.update(synonyms)
- self._dispatch.update(dispatch)
-
- def __hash__(self):
- """
- Define a custom hash function so that Options instances can be used
- as dictionary keys. This is an internal feature used to implement
- the parser. Do not rely on it in application code.
- """
- return int(id(self) % sys.maxint)
-
- def opt_help(self):
- """
- Display this help and exit.
- """
- print self.__str__()
- sys.exit(0)
-
- def opt_version(self):
- """
- Display Twisted version and exit.
- """
- from twisted import copyright
- print "Twisted version:", copyright.version
- sys.exit(0)
-
- #opt_h = opt_help # this conflicted with existing 'host' options.
-
- def parseOptions(self, options=None):
- """
- The guts of the command-line parser.
- """
-
- if options is None:
- options = sys.argv[1:]
-
- # we really do need to place the shell completion check here, because
- # if we used an opt_shell_completion method then it would be possible
- # for other opt_* methods to be run first, and they could possibly
- # raise validation errors which would result in error output on the
- # terminal of the user performing shell completion. Validation errors
- # would occur quite frequently, in fact, because users often initiate
- # tab-completion while they are editing an unfinished command-line.
- if len(options) > 1 and options[-2] == "--_shell-completion":
- from twisted.python import _shellcomp
- cmdName = path.basename(sys.argv[0])
- _shellcomp.shellComplete(self, cmdName, options,
- self._shellCompFile)
- sys.exit(0)
-
- try:
- opts, args = getopt.getopt(options,
- self.shortOpt, self.longOpt)
- except getopt.error, e:
- raise UsageError(str(e))
-
- for opt, arg in opts:
- if opt[1] == '-':
- opt = opt[2:]
- else:
- opt = opt[1:]
-
- optMangled = opt
- if optMangled not in self.synonyms:
- optMangled = opt.replace("-", "_")
- if optMangled not in self.synonyms:
- raise UsageError("No such option '%s'" % (opt,))
-
- optMangled = self.synonyms[optMangled]
- if isinstance(self._dispatch[optMangled], CoerceParameter):
- self._dispatch[optMangled].dispatch(optMangled, arg)
- else:
- self._dispatch[optMangled](optMangled, arg)
-
- if (getattr(self, 'subCommands', None)
- and (args or self.defaultSubCommand is not None)):
- if not args:
- args = [self.defaultSubCommand]
- sub, rest = args[0], args[1:]
- for (cmd, short, parser, doc) in self.subCommands:
- if sub == cmd or sub == short:
- self.subCommand = cmd
- self.subOptions = parser()
- self.subOptions.parent = self
- self.subOptions.parseOptions(rest)
- break
- else:
- raise UsageError("Unknown command: %s" % sub)
- else:
- try:
- self.parseArgs(*args)
- except TypeError:
- raise UsageError("Wrong number of arguments.")
-
- self.postOptions()
-
- def postOptions(self):
- """
- I am called after the options are parsed.
-
- Override this method in your subclass to do something after
- the options have been parsed and assigned, like validate that
- all options are sane.
- """
-
- def parseArgs(self):
- """
- I am called with any leftover arguments which were not options.
-
- Override me to do something with the remaining arguments on
- the command line, those which were not flags or options. e.g.
- interpret them as a list of files to operate on.
-
- Note that if there more arguments on the command line
- than this method accepts, parseArgs will blow up with
- a getopt.error. This means if you don't override me,
- parseArgs will blow up if I am passed any arguments at
- all!
- """
-
- def _generic_flag(self, flagName, value=None):
- if value not in ('', None):
- raise UsageError("Flag '%s' takes no argument."
- " Not even \"%s\"." % (flagName, value))
-
- self.opts[flagName] = 1
-
- def _gather_flags(self):
- """
- Gather up boolean (flag) options.
- """
-
- longOpt, shortOpt = [], ''
- docs, settings, synonyms, dispatch = {}, {}, {}, {}
-
- flags = []
- reflect.accumulateClassList(self.__class__, 'optFlags', flags)
-
- for flag in flags:
- long, short, doc = util.padTo(3, flag)
- if not long:
- raise ValueError("A flag cannot be without a name.")
-
- docs[long] = doc
- settings[long] = 0
- if short:
- shortOpt = shortOpt + short
- synonyms[short] = long
- longOpt.append(long)
- synonyms[long] = long
- dispatch[long] = self._generic_flag
-
- return longOpt, shortOpt, docs, settings, synonyms, dispatch
-
- def _gather_parameters(self):
- """
- Gather options which take a value.
- """
- longOpt, shortOpt = [], ''
- docs, settings, synonyms, dispatch = {}, {}, {}, {}
-
- parameters = []
-
- reflect.accumulateClassList(self.__class__, 'optParameters',
- parameters)
-
- synonyms = {}
-
- for parameter in parameters:
- long, short, default, doc, paramType = util.padTo(5, parameter)
- if not long:
- raise ValueError("A parameter cannot be without a name.")
-
- docs[long] = doc
- settings[long] = default
- if short:
- shortOpt = shortOpt + short + ':'
- synonyms[short] = long
- longOpt.append(long + '=')
- synonyms[long] = long
- if paramType is not None:
- dispatch[long] = CoerceParameter(self, paramType)
- else:
- dispatch[long] = CoerceParameter(self, str)
-
- return longOpt, shortOpt, docs, settings, synonyms, dispatch
-
-
- def _gather_handlers(self):
- """
- Gather up options with their own handler methods.
-
- This returns a tuple of many values. Amongst those values is a
- synonyms dictionary, mapping all of the possible aliases (C{str})
- for an option to the longest spelling of that option's name
- C({str}).
-
- Another element is a dispatch dictionary, mapping each user-facing
- option name (with - substituted for _) to a callable to handle that
- option.
- """
-
- longOpt, shortOpt = [], ''
- docs, settings, synonyms, dispatch = {}, {}, {}, {}
-
- dct = {}
- reflect.addMethodNamesToDict(self.__class__, dct, "opt_")
-
- for name in dct.keys():
- method = getattr(self, 'opt_'+name)
-
- takesArg = not flagFunction(method, name)
-
- prettyName = name.replace('_', '-')
- doc = getattr(method, '__doc__', None)
- if doc:
- ## Only use the first line.
- #docs[name] = doc.split('\n')[0]
- docs[prettyName] = doc
- else:
- docs[prettyName] = self.docs.get(prettyName)
-
- synonyms[prettyName] = prettyName
-
- # A little slight-of-hand here makes dispatching much easier
- # in parseOptions, as it makes all option-methods have the
- # same signature.
- if takesArg:
- fn = lambda name, value, m=method: m(value)
- else:
- # XXX: This won't raise a TypeError if it's called
- # with a value when it shouldn't be.
- fn = lambda name, value=None, m=method: m()
-
- dispatch[prettyName] = fn
-
- if len(name) == 1:
- shortOpt = shortOpt + name
- if takesArg:
- shortOpt = shortOpt + ':'
- else:
- if takesArg:
- prettyName = prettyName + '='
- longOpt.append(prettyName)
-
- reverse_dct = {}
- # Map synonyms
- for name in dct.keys():
- method = getattr(self, 'opt_' + name)
- if method not in reverse_dct:
- reverse_dct[method] = []
- reverse_dct[method].append(name.replace('_', '-'))
-
- cmpLength = lambda a, b: cmp(len(a), len(b))
-
- for method, names in reverse_dct.items():
- if len(names) < 2:
- continue
- names_ = names[:]
- names_.sort(cmpLength)
- longest = names_.pop()
- for name in names_:
- synonyms[name] = longest
-
- return longOpt, shortOpt, docs, settings, synonyms, dispatch
-
-
- def __str__(self):
- return self.getSynopsis() + '\n' + self.getUsage(width=None)
-
- def getSynopsis(self):
- """
- Returns a string containing a description of these options and how to
- pass them to the executed file.
- """
-
- default = "%s%s" % (path.basename(sys.argv[0]),
- (self.longOpt and " [options]") or '')
- if self.parent is None:
- default = "Usage: %s%s" % (path.basename(sys.argv[0]),
- (self.longOpt and " [options]") or '')
- else:
- default = '%s' % ((self.longOpt and "[options]") or '')
- synopsis = getattr(self, "synopsis", default)
-
- synopsis = synopsis.rstrip()
-
- if self.parent is not None:
- synopsis = ' '.join((self.parent.getSynopsis(),
- self.parent.subCommand, synopsis))
-
- return synopsis
-
- def getUsage(self, width=None):
- # If subOptions exists by now, then there was probably an error while
- # parsing its options.
- if hasattr(self, 'subOptions'):
- return self.subOptions.getUsage(width=width)
-
- if not width:
- width = int(os.environ.get('COLUMNS', '80'))
-
- if hasattr(self, 'subCommands'):
- cmdDicts = []
- for (cmd, short, parser, desc) in self.subCommands:
- cmdDicts.append(
- {'long': cmd,
- 'short': short,
- 'doc': desc,
- 'optType': 'command',
- 'default': None
- })
- chunks = docMakeChunks(cmdDicts, width)
- commands = 'Commands:\n' + ''.join(chunks)
- else:
- commands = ''
-
- longToShort = {}
- for key, value in self.synonyms.items():
- longname = value
- if (key != longname) and (len(key) == 1):
- longToShort[longname] = key
- else:
- if longname not in longToShort:
- longToShort[longname] = None
- else:
- pass
-
- optDicts = []
- for opt in self.longOpt:
- if opt[-1] == '=':
- optType = 'parameter'
- opt = opt[:-1]
- else:
- optType = 'flag'
-
- optDicts.append(
- {'long': opt,
- 'short': longToShort[opt],
- 'doc': self.docs[opt],
- 'optType': optType,
- 'default': self.defaults.get(opt, None),
- 'dispatch': self._dispatch.get(opt, None)
- })
-
- if not (getattr(self, "longdesc", None) is None):
- longdesc = self.longdesc
- else:
- import __main__
- if getattr(__main__, '__doc__', None):
- longdesc = __main__.__doc__
- else:
- longdesc = ''
-
- if longdesc:
- longdesc = ('\n' +
- '\n'.join(text.wordWrap(longdesc, width)).strip()
- + '\n')
-
- if optDicts:
- chunks = docMakeChunks(optDicts, width)
- s = "Options:\n%s" % (''.join(chunks))
- else:
- s = "Options: None\n"
-
- return s + longdesc + commands
-
- #def __repr__(self):
- # XXX: It'd be cool if we could return a succinct representation
- # of which flags and options are set here.
-
-
-_ZSH = 'zsh'
-_BASH = 'bash'
-
-class Completer(object):
- """
- A completion "action" - provides completion possibilities for a particular
- command-line option. For example we might provide the user a fixed list of
- choices, or files/dirs according to a glob.
-
- This class produces no completion matches itself - see the various
- subclasses for specific completion functionality.
- """
- _descr = None
- def __init__(self, descr=None, repeat=False):
- """
- @type descr: C{str}
- @param descr: An optional descriptive string displayed above matches.
-
- @type repeat: C{bool}
- @param repeat: A flag, defaulting to False, indicating whether this
- C{Completer} should repeat - that is, be used to complete more
- than one command-line word. This may ONLY be set to True for
- actions in the C{extraActions} keyword argument to C{Completions}.
- And ONLY if it is the LAST (or only) action in the C{extraActions}
- list.
- """
- if descr is not None:
- self._descr = descr
- self._repeat = repeat
-
-
- def _getRepeatFlag(self):
- if self._repeat:
- return "*"
- else:
- return ""
- _repeatFlag = property(_getRepeatFlag)
-
-
- def _description(self, optName):
- if self._descr is not None:
- return self._descr
- else:
- return optName
-
-
- def _shellCode(self, optName, shellType):
- """
- Fetch a fragment of shell code representing this action which is
- suitable for use by the completion system in _shellcomp.py
-
- @type optName: C{str}
- @param optName: The long name of the option this action is being
- used for.
-
- @type shellType: C{str}
- @param shellType: One of the supported shell constants e.g.
- C{twisted.python.usage._ZSH}
- """
- if shellType == _ZSH:
- return "%s:%s:" % (self._repeatFlag,
- self._description(optName))
- raise NotImplementedError("Unknown shellType %r" % (shellType,))
-
-
-
-class CompleteFiles(Completer):
- """
- Completes file names based on a glob pattern
- """
- def __init__(self, globPattern='*', **kw):
- Completer.__init__(self, **kw)
- self._globPattern = globPattern
-
-
- def _description(self, optName):
- if self._descr is not None:
- return "%s (%s)" % (self._descr, self._globPattern)
- else:
- return "%s (%s)" % (optName, self._globPattern)
-
-
- def _shellCode(self, optName, shellType):
- if shellType == _ZSH:
- return "%s:%s:_files -g \"%s\"" % (self._repeatFlag,
- self._description(optName),
- self._globPattern,)
- raise NotImplementedError("Unknown shellType %r" % (shellType,))
-
-
-
-class CompleteDirs(Completer):
- """
- Completes directory names
- """
- def _shellCode(self, optName, shellType):
- if shellType == _ZSH:
- return "%s:%s:_directories" % (self._repeatFlag,
- self._description(optName))
- raise NotImplementedError("Unknown shellType %r" % (shellType,))
-
-
-
-class CompleteList(Completer):
- """
- Completes based on a fixed list of words
- """
- def __init__(self, items, **kw):
- Completer.__init__(self, **kw)
- self._items = items
-
- def _shellCode(self, optName, shellType):
- if shellType == _ZSH:
- return "%s:%s:(%s)" % (self._repeatFlag,
- self._description(optName),
- " ".join(self._items,))
- raise NotImplementedError("Unknown shellType %r" % (shellType,))
-
-
-
-class CompleteMultiList(Completer):
- """
- Completes multiple comma-separated items based on a fixed list of words
- """
- def __init__(self, items, **kw):
- Completer.__init__(self, **kw)
- self._items = items
-
- def _shellCode(self, optName, shellType):
- if shellType == _ZSH:
- return "%s:%s:_values -s , '%s' %s" % (self._repeatFlag,
- self._description(optName),
- self._description(optName),
- " ".join(self._items))
- raise NotImplementedError("Unknown shellType %r" % (shellType,))
-
-
-
-class CompleteUsernames(Completer):
- """
- Complete usernames
- """
- def _shellCode(self, optName, shellType):
- if shellType == _ZSH:
- return "%s:%s:_users" % (self._repeatFlag,
- self._description(optName))
- raise NotImplementedError("Unknown shellType %r" % (shellType,))
-
-
-
-class CompleteGroups(Completer):
- """
- Complete system group names
- """
- _descr = 'group'
- def _shellCode(self, optName, shellType):
- if shellType == _ZSH:
- return "%s:%s:_groups" % (self._repeatFlag,
- self._description(optName))
- raise NotImplementedError("Unknown shellType %r" % (shellType,))
-
-
-
-class CompleteHostnames(Completer):
- """
- Complete hostnames
- """
- def _shellCode(self, optName, shellType):
- if shellType == _ZSH:
- return "%s:%s:_hosts" % (self._repeatFlag,
- self._description(optName))
- raise NotImplementedError("Unknown shellType %r" % (shellType,))
-
-
-
-class CompleteUserAtHost(Completer):
- """
- A completion action which produces matches in any of these forms::
- <username>
- <hostname>
- <username>@<hostname>
- """
- _descr = 'host | user@host'
- def _shellCode(self, optName, shellType):
- if shellType == _ZSH:
- # Yes this looks insane but it does work. For bonus points
- # add code to grep 'Hostname' lines from ~/.ssh/config
- return ('%s:%s:{_ssh;if compset -P "*@"; '
- 'then _wanted hosts expl "remote host name" _ssh_hosts '
- '&& ret=0 elif compset -S "@*"; then _wanted users '
- 'expl "login name" _ssh_users -S "" && ret=0 '
- 'else if (( $+opt_args[-l] )); then tmp=() '
- 'else tmp=( "users:login name:_ssh_users -qS@" ) fi; '
- '_alternative "hosts:remote host name:_ssh_hosts" "$tmp[@]"'
- ' && ret=0 fi}' % (self._repeatFlag,
- self._description(optName)))
- raise NotImplementedError("Unknown shellType %r" % (shellType,))
-
-
-
-class CompleteNetInterfaces(Completer):
- """
- Complete network interface names
- """
- def _shellCode(self, optName, shellType):
- if shellType == _ZSH:
- return "%s:%s:_net_interfaces" % (self._repeatFlag,
- self._description(optName))
- raise NotImplementedError("Unknown shellType %r" % (shellType,))
-
-
-
-class Completions(object):
- """
- Extra metadata for the shell tab-completion system.
-
- @type descriptions: C{dict}
- @ivar descriptions: ex. C{{"foo" : "use this description for foo instead"}}
- A dict mapping long option names to alternate descriptions. When this
- variable is defined, the descriptions contained here will override
- those descriptions provided in the optFlags and optParameters
- variables.
-
- @type multiUse: C{list}
- @ivar multiUse: ex. C{ ["foo", "bar"] }
- An iterable containing those long option names which may appear on the
- command line more than once. By default, options will only be completed
- one time.
-
- @type mutuallyExclusive: C{list} of C{tuple}
- @ivar mutuallyExclusive: ex. C{ [("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.
-
- @type optActions: C{dict}
- @ivar optActions: A dict mapping long option names to shell "actions".
- These actions define what may be completed as the argument to the
- given option. By default, all files/dirs will be completed if no
- action is given. For example::
-
- {"foo" : CompleteFiles("*.py", descr="python files"),
- "bar" : CompleteList(["one", "two", "three"]),
- "colors" : CompleteMultiList(["red", "green", "blue"])}
-
- Callables may instead be given for the values in this dict. The
- callable should accept no arguments, and return a C{Completer}
- instance used as the action in the same way as the literal actions in
- the example above.
-
- As you can see in the example above. The "foo" option will have files
- that end in .py 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
-
- Descriptions for the actions may be given with the optional C{descr}
- keyword argument. This is separate from the description of the option
- itself.
-
- 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'
-
- @type extraActions: C{list}
- @ivar extraActions: Extra arguments are those arguments typically
- appearing at the end of the command-line, which are not associated
- with any particular named option. That is, the arguments that are
- given to the parseArgs() method of your usage.Options subclass. For
- example::
- [CompleteFiles(descr="file to read from"),
- Completer(descr="book title")]
-
- In the example above, the 1st non-option argument will be described as
- "file to read from" and all file/dir names will be completed (*). The
- 2nd non-option argument will be described as "book title", but no
- actual completion matches will be produced.
-
- See the various C{Completer} subclasses for other types of things which
- may be tab-completed (users, groups, network interfaces, etc).
-
- Also note the C{repeat=True} flag which may be passed to any of the
- C{Completer} classes. This is set to allow the C{Completer} instance
- to be re-used for subsequent command-line words. See the C{Completer}
- docstring for details.
- """
- def __init__(self, descriptions={}, multiUse=[],
- mutuallyExclusive=[], optActions={}, extraActions=[]):
- self.descriptions = descriptions
- self.multiUse = multiUse
- self.mutuallyExclusive = mutuallyExclusive
- self.optActions = optActions
- self.extraActions = extraActions
-
-
-
-def docMakeChunks(optList, width=80):
- """
- Makes doc chunks for option declarations.
-
- Takes a list of dictionaries, each of which may have one or more
- of the keys 'long', 'short', 'doc', 'default', 'optType'.
-
- Returns a list of strings.
- The strings may be multiple lines,
- all of them end with a newline.
- """
-
- # XXX: sanity check to make sure we have a sane combination of keys.
-
- maxOptLen = 0
- for opt in optList:
- optLen = len(opt.get('long', ''))
- if optLen:
- if opt.get('optType', None) == "parameter":
- # these take up an extra character
- optLen = optLen + 1
- maxOptLen = max(optLen, maxOptLen)
-
- colWidth1 = maxOptLen + len(" -s, -- ")
- colWidth2 = width - colWidth1
- # XXX - impose some sane minimum limit.
- # Then if we don't have enough room for the option and the doc
- # to share one line, they can take turns on alternating lines.
-
- colFiller1 = " " * colWidth1
-
- optChunks = []
- seen = {}
- for opt in optList:
- if opt.get('short', None) in seen or opt.get('long', None) in seen:
- continue
- for x in opt.get('short', None), opt.get('long', None):
- if x is not None:
- seen[x] = 1
-
- optLines = []
- comma = " "
- if opt.get('short', None):
- short = "-%c" % (opt['short'],)
- else:
- short = ''
-
- if opt.get('long', None):
- long = opt['long']
- if opt.get("optType", None) == "parameter":
- long = long + '='
-
- long = "%-*s" % (maxOptLen, long)
- if short:
- comma = ","
- else:
- long = " " * (maxOptLen + len('--'))
-
- if opt.get('optType', None) == 'command':
- column1 = ' %s ' % long
- else:
- column1 = " %2s%c --%s " % (short, comma, long)
-
- if opt.get('doc', ''):
- doc = opt['doc'].strip()
- else:
- doc = ''
-
- if (opt.get("optType", None) == "parameter") \
- and not (opt.get('default', None) is None):
- doc = "%s [default: %s]" % (doc, opt['default'])
-
- if (opt.get("optType", None) == "parameter") \
- and opt.get('dispatch', None) is not None:
- d = opt['dispatch']
- if isinstance(d, CoerceParameter) and d.doc:
- doc = "%s. %s" % (doc, d.doc)
-
- if doc:
- column2_l = text.wordWrap(doc, colWidth2)
- else:
- column2_l = ['']
-
- optLines.append("%s%s\n" % (column1, column2_l.pop(0)))
-
- for line in column2_l:
- optLines.append("%s%s\n" % (colFiller1, line))
-
- optChunks.append(''.join(optLines))
-
- return optChunks
-
-
-def flagFunction(method, name=None):
- reqArgs = method.im_func.func_code.co_argcount
- if reqArgs > 2:
- raise UsageError('Invalid Option function for %s' %
- (name or method.func_name))
- if reqArgs == 2:
- # argName = method.im_func.func_code.co_varnames[1]
- return 0
- return 1
-
-
-def portCoerce(value):
- """
- Coerce a string value to an int port number, and checks the validity.
- """
- value = int(value)
- if value < 0 or value > 65535:
- raise ValueError("Port number not in range: %s" % (value,))
- return value
-portCoerce.coerceDoc = "Must be an int between 0 and 65535."
-
-