summaryrefslogtreecommitdiffstats
path: root/jython-tosca-parser/src/main/resources/Lib/site-packages/cliff-2.4.0-py2.7.egg/cliff/app.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/app.py')
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/cliff-2.4.0-py2.7.egg/cliff/app.py423
1 files changed, 0 insertions, 423 deletions
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/cliff-2.4.0-py2.7.egg/cliff/app.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/cliff-2.4.0-py2.7.egg/cliff/app.py
deleted file mode 100644
index 2c2f219..0000000
--- a/jython-tosca-parser/src/main/resources/Lib/site-packages/cliff-2.4.0-py2.7.egg/cliff/app.py
+++ /dev/null
@@ -1,423 +0,0 @@
-# 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.
-
-"""Application base class.
-"""
-
-import codecs
-import inspect
-import locale
-import logging
-import logging.handlers
-import os
-import six
-import sys
-
-from cliff import argparse
-from . import complete
-from . import help
-from . import utils
-
-
-logging.getLogger('cliff').addHandler(logging.NullHandler())
-
-
-class App(object):
- """Application base class.
-
- :param description: one-liner explaining the program purpose
- :paramtype description: str
- :param version: application version number
- :paramtype version: str
- :param command_manager: plugin loader
- :paramtype command_manager: cliff.commandmanager.CommandManager
- :param stdin: Standard input stream
- :paramtype stdin: readable I/O stream
- :param stdout: Standard output stream
- :paramtype stdout: writable I/O stream
- :param stderr: Standard error output stream
- :paramtype stderr: writable I/O stream
- :param interactive_app_factory: callable to create an
- interactive application
- :paramtype interactive_app_factory: cliff.interactive.InteractiveApp
- :param deferred_help: True - Allow subcommands to accept --help with
- allowing to defer help print after initialize_app
- :paramtype deferred_help: bool
- """
-
- NAME = os.path.splitext(os.path.basename(sys.argv[0]))[0]
- LOG = logging.getLogger(NAME)
-
- CONSOLE_MESSAGE_FORMAT = '%(message)s'
- LOG_FILE_MESSAGE_FORMAT = \
- '[%(asctime)s] %(levelname)-8s %(name)s %(message)s'
- DEFAULT_VERBOSE_LEVEL = 1
- DEFAULT_OUTPUT_ENCODING = 'utf-8'
-
- def __init__(self, description, version, command_manager,
- stdin=None, stdout=None, stderr=None,
- interactive_app_factory=None,
- deferred_help=False):
- """Initialize the application.
- """
- self.command_manager = command_manager
- self.command_manager.add_command('help', help.HelpCommand)
- self.command_manager.add_command('complete', complete.CompleteCommand)
- self._set_streams(stdin, stdout, stderr)
- self.interactive_app_factory = interactive_app_factory
- self.deferred_help = deferred_help
- self.parser = self.build_option_parser(description, version)
- self.interactive_mode = False
- self.interpreter = None
-
- def _set_streams(self, stdin, stdout, stderr):
- try:
- locale.setlocale(locale.LC_ALL, '')
- except locale.Error:
- pass
-
- # Unicode must be encoded/decoded for text I/O streams, the
- # correct encoding for the stream must be selected and it must
- # be capable of handling the set of characters in the stream
- # or Python will raise a codec error. The correct codec is
- # selected based on the locale. Python2 uses the locales
- # encoding but only when the I/O stream is attached to a
- # terminal (TTY) otherwise it uses the default ASCII
- # encoding. The effect is internationalized text written to
- # the terminal works as expected but if command line output is
- # redirected (file or pipe) the ASCII codec is used and the
- # program aborts with a codec error.
- #
- # The default I/O streams stdin, stdout and stderr can be
- # wrapped in a codec based on the locale thus assuring the
- # users desired encoding is always used no matter the I/O
- # destination. Python3 does this by default.
- #
- # If the caller supplies an I/O stream we use it unmodified on
- # the assumption the caller has taken all responsibility for
- # the stream. But with Python2 if the caller allows us to
- # default the I/O streams to sys.stdin, sys.stdout and
- # sys.stderr we apply the locales encoding just as Python3
- # would do. We also check to make sure the main Python program
- # has not already already wrapped sys.stdin, sys.stdout and
- # sys.stderr as this is a common recommendation.
-
- if six.PY2:
- encoding = locale.getpreferredencoding()
- if encoding:
- if not (stdin or isinstance(sys.stdin, codecs.StreamReader)):
- stdin = codecs.getreader(encoding)(sys.stdin)
-
- if not (stdout or isinstance(sys.stdout, codecs.StreamWriter)):
- stdout = codecs.getwriter(encoding)(sys.stdout)
-
- if not (stderr or isinstance(sys.stderr, codecs.StreamWriter)):
- stderr = codecs.getwriter(encoding)(sys.stderr)
-
- self.stdin = stdin or sys.stdin
- self.stdout = stdout or sys.stdout
- self.stderr = stderr or sys.stderr
-
- def build_option_parser(self, description, version,
- argparse_kwargs=None):
- """Return an argparse option parser for this application.
-
- Subclasses may override this method to extend
- the parser with more global options.
-
- :param description: full description of the application
- :paramtype description: str
- :param version: version number for the application
- :paramtype version: str
- :param argparse_kwargs: extra keyword argument passed to the
- ArgumentParser constructor
- :paramtype extra_kwargs: dict
- """
- argparse_kwargs = argparse_kwargs or {}
- parser = argparse.ArgumentParser(
- description=description,
- add_help=False,
- **argparse_kwargs
- )
- parser.add_argument(
- '--version',
- action='version',
- version='%(prog)s {0}'.format(version),
- )
- verbose_group = parser.add_mutually_exclusive_group()
- verbose_group.add_argument(
- '-v', '--verbose',
- action='count',
- dest='verbose_level',
- default=self.DEFAULT_VERBOSE_LEVEL,
- help='Increase verbosity of output. Can be repeated.',
- )
- verbose_group.add_argument(
- '-q', '--quiet',
- action='store_const',
- dest='verbose_level',
- const=0,
- help='Suppress output except warnings and errors.',
- )
- parser.add_argument(
- '--log-file',
- action='store',
- default=None,
- help='Specify a file to log output. Disabled by default.',
- )
- if self.deferred_help:
- parser.add_argument(
- '-h', '--help',
- dest='deferred_help',
- action='store_true',
- help="Show help message and exit.",
- )
- else:
- parser.add_argument(
- '-h', '--help',
- action=help.HelpAction,
- nargs=0,
- default=self, # tricky
- help="Show help message and exit.",
- )
- parser.add_argument(
- '--debug',
- default=False,
- action='store_true',
- help='Show tracebacks on errors.',
- )
- return parser
-
- def configure_logging(self):
- """Create logging handlers for any log output.
- """
- root_logger = logging.getLogger('')
- root_logger.setLevel(logging.DEBUG)
-
- # Set up logging to a file
- if self.options.log_file:
- file_handler = logging.FileHandler(
- filename=self.options.log_file,
- )
- formatter = logging.Formatter(self.LOG_FILE_MESSAGE_FORMAT)
- file_handler.setFormatter(formatter)
- root_logger.addHandler(file_handler)
-
- # Always send higher-level messages to the console via stderr
- console = logging.StreamHandler(self.stderr)
- console_level = {0: logging.WARNING,
- 1: logging.INFO,
- 2: logging.DEBUG,
- }.get(self.options.verbose_level, logging.DEBUG)
- console.setLevel(console_level)
- formatter = logging.Formatter(self.CONSOLE_MESSAGE_FORMAT)
- console.setFormatter(formatter)
- root_logger.addHandler(console)
- return
-
- def print_help_if_requested(self):
- """Print help and exits if deferred help is enabled and requested.
-
- '--help' shows the help message and exits:
- * without calling initialize_app if not self.deferred_help (default),
- * after initialize_app call if self.deferred_help,
- * during initialize_app call if self.deferred_help and subclass calls
- explicitly this method in initialize_app.
- """
- if self.deferred_help and self.options.deferred_help:
- action = help.HelpAction(None, None, default=self)
- action(self.parser, self.options, None, None)
-
- def run(self, argv):
- """Equivalent to the main program for the application.
-
- :param argv: input arguments and options
- :paramtype argv: list of str
- """
- try:
- self.options, remainder = self.parser.parse_known_args(argv)
- self.configure_logging()
- self.interactive_mode = not remainder
- if self.deferred_help and self.options.deferred_help and remainder:
- # When help is requested and `remainder` has any values disable
- # `deferred_help` and instead allow the help subcommand to
- # handle the request during run_subcommand(). This turns
- # "app foo bar --help" into "app help foo bar". However, when
- # `remainder` is empty use print_help_if_requested() to allow
- # for an early exit.
- # Disabling `deferred_help` here also ensures that
- # print_help_if_requested will not fire if called by a subclass
- # during its initialize_app().
- self.options.deferred_help = False
- remainder.insert(0, "help")
- self.initialize_app(remainder)
- self.print_help_if_requested()
- except Exception as err:
- if hasattr(self, 'options'):
- debug = self.options.debug
- else:
- debug = True
- if debug:
- self.LOG.exception(err)
- raise
- else:
- self.LOG.error(err)
- return 1
- result = 1
- if self.interactive_mode:
- result = self.interact()
- else:
- result = self.run_subcommand(remainder)
- return result
-
- # FIXME(dhellmann): Consider moving these command handling methods
- # to a separate class.
- def initialize_app(self, argv):
- """Hook for subclasses to take global initialization action
- after the arguments are parsed but before a command is run.
- Invoked only once, even in interactive mode.
-
- :param argv: List of arguments, including the subcommand to run.
- Empty for interactive mode.
- """
- return
-
- def prepare_to_run_command(self, cmd):
- """Perform any preliminary work needed to run a command.
-
- :param cmd: command processor being invoked
- :paramtype cmd: cliff.command.Command
- """
- return
-
- def clean_up(self, cmd, result, err):
- """Hook run after a command is done to shutdown the app.
-
- :param cmd: command processor being invoked
- :paramtype cmd: cliff.command.Command
- :param result: return value of cmd
- :paramtype result: int
- :param err: exception or None
- :paramtype err: Exception
- """
- return
-
- def interact(self):
- # Defer importing .interactive as cmd2 is a slow import
- from .interactive import InteractiveApp
-
- if self.interactive_app_factory is None:
- self.interactive_app_factory = InteractiveApp
- self.interpreter = self.interactive_app_factory(self,
- self.command_manager,
- self.stdin,
- self.stdout,
- )
- self.interpreter.cmdloop()
- return 0
-
- def get_fuzzy_matches(self, cmd):
- """return fuzzy matches of unknown command
- """
-
- sep = '_'
- if self.command_manager.convert_underscores:
- sep = ' '
- all_cmds = [k[0] for k in self.command_manager]
- dist = []
- for candidate in sorted(all_cmds):
- prefix = candidate.split(sep)[0]
- # Give prefix match a very good score
- if candidate.startswith(cmd):
- dist.append((0, candidate))
- continue
- # Levenshtein distance
- dist.append((utils.damerau_levenshtein(cmd, prefix, utils.COST)+1,
- candidate))
-
- matches = []
- match_distance = 0
- for distance, candidate in sorted(dist):
- if distance > match_distance:
- if match_distance:
- # we copied all items with minimum distance, we are done
- break
- # we copied all items with distance=0,
- # now we match all candidates at the minimum distance
- match_distance = distance
- matches.append(candidate)
-
- return matches
-
- def run_subcommand(self, argv):
- try:
- subcommand = self.command_manager.find_command(argv)
- except ValueError as err:
- # If there was no exact match, try to find a fuzzy match
- the_cmd = argv[0]
- fuzzy_matches = self.get_fuzzy_matches(the_cmd)
- if fuzzy_matches:
- article = 'a'
- if self.NAME[0] in 'aeiou':
- article = 'an'
- self.stdout.write('%s: \'%s\' is not %s %s command. '
- 'See \'%s --help\'.\n'
- % (self.NAME, ' '.join(argv), article,
- self.NAME, self.NAME))
- self.stdout.write('Did you mean one of these?\n')
- for match in fuzzy_matches:
- self.stdout.write(' %s\n' % match)
- else:
- if self.options.debug:
- raise
- else:
- self.LOG.error(err)
- return 2
- cmd_factory, cmd_name, sub_argv = subcommand
- kwargs = {}
- if 'cmd_name' in inspect.getargspec(cmd_factory.__init__).args:
- kwargs['cmd_name'] = cmd_name
- cmd = cmd_factory(self, self.options, **kwargs)
- err = None
- result = 1
- try:
- self.prepare_to_run_command(cmd)
- full_name = (cmd_name
- if self.interactive_mode
- else ' '.join([self.NAME, cmd_name])
- )
- cmd_parser = cmd.get_parser(full_name)
- parsed_args = cmd_parser.parse_args(sub_argv)
- result = cmd.run(parsed_args)
- except Exception as err:
- if self.options.debug:
- self.LOG.exception(err)
- else:
- self.LOG.error(err)
- try:
- self.clean_up(cmd, result, err)
- except Exception as err2:
- if self.options.debug:
- self.LOG.exception(err2)
- else:
- self.LOG.error('Could not clean up: %s', err2)
- if self.options.debug:
- raise
- else:
- try:
- self.clean_up(cmd, result, None)
- except Exception as err3:
- if self.options.debug:
- self.LOG.exception(err3)
- else:
- self.LOG.error('Could not clean up: %s', err3)
- return result