aboutsummaryrefslogtreecommitdiffstats
path: root/jython-tosca-parser/src/main/resources/Lib/site-packages/cliff-2.4.0-py2.7.egg/cliff/complete.py
diff options
context:
space:
mode:
Diffstat (limited to 'jython-tosca-parser/src/main/resources/Lib/site-packages/cliff-2.4.0-py2.7.egg/cliff/complete.py')
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/cliff-2.4.0-py2.7.egg/cliff/complete.py221
1 files changed, 221 insertions, 0 deletions
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/cliff-2.4.0-py2.7.egg/cliff/complete.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/cliff-2.4.0-py2.7.egg/cliff/complete.py
new file mode 100644
index 0000000..1e4df76
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/cliff-2.4.0-py2.7.egg/cliff/complete.py
@@ -0,0 +1,221 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+"""Bash completion for the CLI.
+"""
+
+import logging
+
+import six
+import stevedore
+
+from cliff import command
+
+
+class CompleteDictionary:
+ """dictionary for bash completion
+ """
+
+ def __init__(self):
+ self._dictionary = {}
+
+ def add_command(self, command, actions):
+ optstr = ' '.join(opt for action in actions
+ for opt in action.option_strings)
+ dicto = self._dictionary
+ last_cmd = command[-1]
+ for subcmd in command[:-1]:
+ subdata = dicto.get(subcmd)
+ # If there is a string in corresponding dictionary, it means the
+ # verb used for the command exists already.
+ # For example, {'cmd': 'action'}, and we add the command
+ # 'cmd_other'. We want the result to be
+ # {'cmd': 'action other', 'cmd_other': 'sub_action'}
+ if isinstance(subdata, six.string_types):
+ subdata += ' ' + last_cmd
+ dicto[subcmd] = subdata
+ last_cmd = subcmd + '_' + last_cmd
+ else:
+ dicto = dicto.setdefault(subcmd, {})
+ dicto[last_cmd] = optstr
+
+ def get_commands(self):
+ return ' '.join(k for k in sorted(self._dictionary.keys()))
+
+ def _get_data_recurse(self, dictionary, path):
+ ray = []
+ keys = sorted(dictionary.keys())
+ for cmd in keys:
+ name = path + "_" + cmd if path else cmd
+ value = dictionary[cmd]
+ if isinstance(value, six.string_types):
+ ray.append((name, value))
+ else:
+ cmdlist = ' '.join(sorted(value.keys()))
+ ray.append((name, cmdlist))
+ ray += self._get_data_recurse(value, name)
+ return ray
+
+ def get_data(self):
+ return sorted(self._get_data_recurse(self._dictionary, ""))
+
+
+class CompleteShellBase(object):
+ """base class for bash completion generation
+ """
+ def __init__(self, name, output):
+ self.name = str(name)
+ self.output = output
+
+ def write(self, cmdo, data):
+ self.output.write(self.get_header())
+ self.output.write(" cmds='{0}'\n".format(cmdo))
+ for datum in data:
+ datum = (datum[0].replace('-', '_'), datum[1])
+ self.output.write(' cmds_{0}=\'{1}\'\n'.format(*datum))
+ self.output.write(self.get_trailer())
+
+ @property
+ def escaped_name(self):
+ return self.name.replace('-', '_')
+
+
+class CompleteNoCode(CompleteShellBase):
+ """completion with no code
+ """
+ def __init__(self, name, output):
+ super(CompleteNoCode, self).__init__(name, output)
+
+ def get_header(self):
+ return ''
+
+ def get_trailer(self):
+ return ''
+
+
+class CompleteBash(CompleteShellBase):
+ """completion for bash
+ """
+ def __init__(self, name, output):
+ super(CompleteBash, self).__init__(name, output)
+
+ def get_header(self):
+ return ('_' + self.escaped_name + """()
+{
+ local cur prev words
+ COMPREPLY=()
+ _get_comp_words_by_ref -n : cur prev words
+
+ # Command data:
+""")
+
+ def get_trailer(self):
+ return ("""
+ dash=-
+ underscore=_
+ cmd=""
+ words[0]=""
+ completed="${cmds}"
+ for var in "${words[@]:1}"
+ do
+ if [[ ${var} == -* ]] ; then
+ break
+ fi
+ if [ -z "${cmd}" ] ; then
+ proposed="${var}"
+ else
+ proposed="${cmd}_${var}"
+ fi
+ local i="cmds_${proposed}"
+ i=${i//$dash/$underscore}
+ local comp="${!i}"
+ if [ -z "${comp}" ] ; then
+ break
+ fi
+ if [[ ${comp} == -* ]] ; then
+ if [[ ${cur} != -* ]] ; then
+ completed=""
+ break
+ fi
+ fi
+ cmd="${proposed}"
+ completed="${comp}"
+ done
+
+ if [ -z "${completed}" ] ; then
+ COMPREPLY=( $( compgen -f -- "$cur" ) $( compgen -d -- "$cur" ) )
+ else
+ COMPREPLY=( $(compgen -W "${completed}" -- ${cur}) )
+ fi
+ return 0
+}
+complete -F _""" + self.escaped_name + ' ' + self.name + '\n')
+
+
+class CompleteCommand(command.Command):
+ """print bash completion command
+ """
+
+ log = logging.getLogger(__name__ + '.CompleteCommand')
+
+ def __init__(self, app, app_args):
+ super(CompleteCommand, self).__init__(app, app_args)
+ self._formatters = stevedore.ExtensionManager(
+ namespace='cliff.formatter.completion',
+ )
+
+ def get_parser(self, prog_name):
+ parser = super(CompleteCommand, self).get_parser(prog_name)
+ parser.add_argument(
+ "--name",
+ default=None,
+ metavar='<command_name>',
+ help="Command name to support with command completion"
+ )
+ parser.add_argument(
+ "--shell",
+ default='bash',
+ metavar='<shell>',
+ choices=sorted(self._formatters.names()),
+ help="Shell being used. Use none for data only (default: bash)"
+ )
+ return parser
+
+ def get_actions(self, command):
+ the_cmd = self.app.command_manager.find_command(command)
+ cmd_factory, cmd_name, search_args = the_cmd
+ cmd = cmd_factory(self.app, search_args)
+ if self.app.interactive_mode:
+ full_name = (cmd_name)
+ else:
+ full_name = (' '.join([self.app.NAME, cmd_name]))
+ cmd_parser = cmd.get_parser(full_name)
+ return cmd_parser._get_optional_actions()
+
+ def take_action(self, parsed_args):
+ self.log.debug('take_action(%s)' % parsed_args)
+
+ name = parsed_args.name or self.app.NAME
+ try:
+ shell_factory = self._formatters[parsed_args.shell].plugin
+ except KeyError:
+ raise RuntimeError('Unknown shell syntax %r' % parsed_args.shell)
+ shell = shell_factory(name, self.app.stdout)
+
+ dicto = CompleteDictionary()
+ for cmd in self.app.command_manager:
+ command = cmd[0].split()
+ dicto.add_command(command, self.get_actions(command))
+
+ shell.write(dicto.get_commands(), dicto.get_data())
+
+ return 0