diff options
Diffstat (limited to 'debuginfo-tests/dexter/dex/tools/ToolBase.py')
-rw-r--r-- | debuginfo-tests/dexter/dex/tools/ToolBase.py | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/debuginfo-tests/dexter/dex/tools/ToolBase.py b/debuginfo-tests/dexter/dex/tools/ToolBase.py new file mode 100644 index 00000000000..eb6ba94c2de --- /dev/null +++ b/debuginfo-tests/dexter/dex/tools/ToolBase.py @@ -0,0 +1,135 @@ +# DExTer : Debugging Experience Tester +# ~~~~~~ ~ ~~ ~ ~~ +# +# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +# See https://llvm.org/LICENSE.txt for license information. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +"""Base class for all subtools.""" + +import abc +import os +import tempfile + +from dex import __version__ +from dex.utils import ExtArgParse +from dex.utils import PrettyOutput +from dex.utils.ReturnCode import ReturnCode + + +class ToolBase(object, metaclass=abc.ABCMeta): + def __init__(self, context): + self.context = context + self.parser = None + + @abc.abstractproperty + def name(self): + pass + + @abc.abstractmethod + def add_tool_arguments(self, parser, defaults): + pass + + def parse_command_line(self, args): + """Define two parsers: pparser and self.parser. + pparser deals with args that need to be parsed prior to any of those of + self.parser. For example, any args which may affect the state of + argparse error output. + """ + + class defaults(object): + pass + + pparser = ExtArgParse.ExtArgumentParser( + self.context, add_help=False, prog=self.name) + + pparser.add_argument( + '--no-color-output', + action='store_true', + default=False, + help='do not use colored output on stdout/stderr') + pparser.add_argument( + '--time-report', + action='store_true', + default=False, + help='display timing statistics') + + self.parser = ExtArgParse.ExtArgumentParser( + self.context, parents=[pparser], prog=self.name) + self.parser.add_argument( + '-v', + '--verbose', + action='store_true', + default=False, + help='enable verbose output') + self.parser.add_argument( + '-V', + '--version', + action='store_true', + default=False, + help='display the DExTer version and exit') + self.parser.add_argument( + '-w', + '--no-warnings', + action='store_true', + default=False, + help='suppress warning output') + self.parser.add_argument( + '--unittest', + type=str, + choices=['off', 'show-failures', 'show-all'], + default='off', + help='run the DExTer codebase unit tests') + + suppress = ExtArgParse.SUPPRESS # pylint: disable=no-member + self.parser.add_argument( + '--colortest', action='store_true', default=False, help=suppress) + self.parser.add_argument( + '--error-debug', action='store_true', default=False, help=suppress) + defaults.working_directory = os.path.join(tempfile.gettempdir(), + 'dexter') + self.parser.add_argument( + '--indent-timer-level', type=int, default=1, help=suppress) + self.parser.add_argument( + '--working-directory', + type=str, + metavar='<file>', + default=None, + display_default=defaults.working_directory, + help='location of working directory') + self.parser.add_argument( + '--save-temps', + action='store_true', + default=False, + help='save temporary files') + + self.add_tool_arguments(self.parser, defaults) + + # If an error is encountered during pparser, show the full usage text + # including self.parser options. Strip the preceding 'usage: ' to avoid + # having it appear twice. + pparser.usage = self.parser.format_usage().lstrip('usage: ') + + options, args = pparser.parse_known_args(args) + + if options.no_color_output: + PrettyOutput.stdout.color_enabled = False + PrettyOutput.stderr.color_enabled = False + + options = self.parser.parse_args(args, namespace=options) + return options, defaults + + def handle_base_options(self, defaults): + self.handle_options(defaults) + + options = self.context.options + + if options.working_directory is None: + options.working_directory = defaults.working_directory + + @abc.abstractmethod + def handle_options(self, defaults): + pass + + @abc.abstractmethod + def go(self) -> ReturnCode: + pass |