| # 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 |
| """Help tool.""" |
| |
| import imp |
| import textwrap |
| |
| from dex.tools import ToolBase, get_tool_names, get_tools_directory, tool_main |
| from dex.utils.ReturnCode import ReturnCode |
| |
| |
| class Tool(ToolBase): |
| """Provides help info on subtools.""" |
| |
| @property |
| def name(self): |
| return 'DExTer help' |
| |
| @property |
| def _visible_tool_names(self): |
| return [t for t in get_tool_names() if not t.endswith('-')] |
| |
| def add_tool_arguments(self, parser, defaults): |
| parser.description = Tool.__doc__ |
| parser.add_argument( |
| 'tool', |
| choices=self._visible_tool_names, |
| nargs='?', |
| help='name of subtool') |
| |
| def handle_options(self, defaults): |
| pass |
| |
| @property |
| def _default_text(self): |
| s = '\n<b>The following subtools are available:</>\n\n' |
| tools_directory = get_tools_directory() |
| for tool_name in sorted(self._visible_tool_names): |
| internal_name = tool_name.replace('-', '_') |
| module_info = imp.find_module(internal_name, [tools_directory]) |
| tool_doc = imp.load_module(internal_name, |
| *module_info).Tool.__doc__ |
| tool_doc = tool_doc.strip() if tool_doc else '' |
| tool_doc = textwrap.fill(' '.join(tool_doc.split()), 80) |
| s += '<g>{}</>\n{}\n\n'.format(tool_name, tool_doc) |
| return s |
| |
| def go(self) -> ReturnCode: |
| if self.context.options.tool is None: |
| self.context.o.auto(self._default_text) |
| return ReturnCode.OK |
| |
| tool_name = self.context.options.tool.replace('-', '_') |
| tools_directory = get_tools_directory() |
| module_info = imp.find_module(tool_name, [tools_directory]) |
| module = imp.load_module(tool_name, *module_info) |
| return tool_main(self.context, module.Tool(self.context), ['--help']) |