def __init__(self): summary_parts = [util.color_text("TAU Commander %s" % TAUCMDR_VERSION, 'red', attrs=['bold']), util.color_text(" [ ", attrs=['bold']), util.color_text(taucmdr.TAUCMDR_URL, 'cyan', attrs=['bold']), util.color_text(" ]", attrs=['bold'])] super(MainCommand, self).__init__(__name__, summary_fmt=''.join(summary_parts), help_page_fmt=HELP_PAGE_FMT) self.command = os.path.basename(TAUCMDR_SCRIPT)
def commands_description(package_name=COMMANDS_PACKAGE_NAME): """Builds listing of command names with short description. Args: package_name (str): A dot-seperated string naming the module to search for cli. Returns: str: Help string describing all commands found at or below `root`. """ groups = {} commands = sorted([i for i in _get_commands(package_name).iteritems() if i[0] != '__module__']) for cmd, topcmd in commands: module = topcmd['__module__'] try: command_obj = module.COMMAND except AttributeError: continue descr = command_obj.summary.split('\n')[0] group = command_obj.group name = util.color_text('{:<14}'.format(cmd), 'green') groups.setdefault(group, []).append(' %s | %s' % (name, descr)) parts = [] for group, members in groups.iteritems(): if group: title = util.color_text(group.title() + ' Subcommands:', attrs=['bold']) else: title = util.color_text('Subcommands:', attrs=['bold']) parts.append(title) parts.extend(members) parts.append('') return '\n'.join(parts)
def __init__(self): summary_parts = [util.color_text("TAU Commander %s" % TAUCMDR_VERSION, 'red', attrs=['bold']), util.color_text(" [ ", attrs=['bold']), util.color_text(taucmdr.TAUCMDR_URL, 'cyan', attrs=['bold']), util.color_text(" ]", attrs=['bold'])] super(MainCommand, self).__init__(__name__, summary_fmt=''.join(summary_parts), help_page_fmt=HELP_PAGE_FMT) self.command = os.path.basename(TAUCMDR_SCRIPT)
def _construct_parser(self): usage = "%s [arguments] <subcommand> [options]" % self.command _green = lambda x: "{:<35}".format(util.color_text(x, 'green')) epilog_parts = [ "", cli.commands_description(), "", util.color_text("Shortcuts:", attrs=["bold"]), _green(" %(command)s <compiler>") + "Execute a compiler command", " - Example: %(command)s gcc *.c -o a.out", " - Alias for '%(command)s build <compiler>'", _green(" %(command)s <program>") + "Gather data from a program", " - Example: %(command)s ./a.out", " - Alias for '%(command)s trial create <program>'", _green(" %(command)s metrics") + "Show metrics available in the current experiment", " - Alias for '%(command)s target metrics'", _green(" %(command)s select") + "Select configuration objects to create a new experiment", " - Alias for '%(command)s experiment create'", _green(" %(command)s show") + "Show data from the most recent trial", " - Alias for '%(command)s trial show'", "", "See `%(command)s help <subcommand>` for more information on a subcommand." ] epilog = '\n'.join(epilog_parts) % { 'color_command': util.color_text(self.command, 'cyan'), 'command': self.command } parser = arguments.get_parser(prog=self.command, usage=usage, description=self.summary, epilog=epilog) parser.add_argument('command', help="See subcommand descriptions below", metavar='<subcommand>') parser.add_argument('options', help="Options to be passed to <subcommand>", metavar='[options]', nargs=arguments.REMAINDER) parser.add_argument('-V', '--version', action='version', version=taucmdr.version_banner()) group = parser.add_mutually_exclusive_group() group.add_argument('-v', '--verbose', help="show debugging messages", const='DEBUG', default=arguments.SUPPRESS, action='store_const') group.add_argument('-q', '--quiet', help="suppress all output except error messages", const='ERROR', default=arguments.SUPPRESS, action='store_const') return parser
def main(self, argv): """Command program entry point. Args: argv (list): Command line arguments. Returns: int: Process return code: non-zero if a problem occurred, 0 otherwise """ args = self._parse_args(argv) style_args = ['--' + args.style] if hasattr(args, 'style') else [] levels = arguments.parse_storage_flag(args) keys = getattr(args, 'keys', []) single = (len(keys) == 1 and len(levels) == 1) if single: proj_name = keys[0] self.title_fmt = "Project Configuration (%(storage_path)s)" target_list_cmd.title_fmt = "Targets in project '%s'" % proj_name application_list_cmd.title_fmt = "Applications in project '%s'" % proj_name measurement_list_cmd.title_fmt = "Measurements in project '%s'" % proj_name experiment_list_cmd.title_fmt = "Experiments in project '%s'" % proj_name retval = super(ProjectListCommand, self).main(argv) if single: storage = levels[0] ctrl = Project.controller(storage) proj = ctrl.one({'name': keys[0]}, context=False) for cmd, prop in ((target_list_cmd, 'targets'), (application_list_cmd, 'applications'), (measurement_list_cmd, 'measurements'), (experiment_list_cmd, 'experiments')): primary_key = proj.attributes[prop]['collection'].key_attribute records = proj.populate(prop, context=False) if records: cmd.main([record[primary_key] for record in records] + ['-p'] + [proj['name']] + style_args) else: label = util.color_text('%s: No %s' % (proj['name'], prop), color='red', attrs=['bold']) print "%s. Use `%s` to view available %s.\n" % (label, cmd, prop) try: expr = proj.experiment() if not isinstance(expr, NoneType): print util.color_text("Selected Experiment: ", 'cyan') + expr['name'] except ExperimentSelectionError: print( util.color_text('No selected experiment: ', 'red') + 'Use `%s` to create or select an experiment.' % select_cmd) return retval
def main(self, argv): """Command program entry point. Args: argv (list): Command line arguments. Returns: int: Process return code: non-zero if a problem occurred, 0 otherwise """ args = self._parse_args(argv) style_args = ['--' + args.style] if hasattr(args, 'style') else [] levels = arguments.parse_storage_flag(args) keys = getattr(args, 'keys', []) single = (len(keys) == 1 and len(levels) == 1) if single: proj_name = keys[0] self.title_fmt = "Project Configuration (%(storage_path)s)" target_list_cmd.title_fmt = "Targets in project '%s'" % proj_name application_list_cmd.title_fmt = "Applications in project '%s'" % proj_name measurement_list_cmd.title_fmt = "Measurements in project '%s'" % proj_name experiment_list_cmd.title_fmt = "Experiments in project '%s'" % proj_name retval = super(ProjectListCommand, self).main(argv) if single: storage = levels[0] ctrl = Project.controller(storage) proj = ctrl.one({'name': keys[0]}) for cmd, prop in ((target_list_cmd, 'targets'), (application_list_cmd, 'applications'), (measurement_list_cmd, 'measurements'), (experiment_list_cmd, 'experiments')): primary_key = proj.attributes[prop]['collection'].key_attribute records = proj.populate(prop) if records: cmd.main([record[primary_key] for record in records] + style_args) else: label = util.color_text('%s: No %s' % (proj['name'], prop), color='red', attrs=['bold']) print "%s. Use `%s` to view available %s.\n" % (label, cmd, prop) if proj.get('force_tau_options', False): self.logger.warning("Project '%s' will add '%s' to TAU_OPTIONS without error checking.", proj['name'], ' '.join(proj['force_tau_options'])) try: expr = proj.experiment() except ExperimentSelectionError: print (util.color_text('No selected experiment: ', 'red') + 'Use `%s` to create or select an experiment.' % select_cmd) else: print util.color_text("Selected Experiment: ", 'cyan') + expr['name'] return retval
def main(self, argv): """Command program entry point. Args: argv (list): Command line arguments. Returns: int: Process return code: non-zero if a problem occurred, 0 otherwise """ args = self._parse_args(argv) if args.current: proj = Project.controller().selected() try: expr = proj.experiment() except ExperimentSelectionError: print( util.color_text('No selected experiment: ', 'red') + 'Use `%s` to create or select an experiment.' % select_cmd) else: print expr['name'] retval = EXIT_SUCCESS else: retval = super(ExperimentListCommand, self).main(argv) return retval
def _construct_parser(self): usage = "%s [arguments] <subcommand> [options]" % self.command _green = lambda x: "{:<35}".format(util.color_text(x, 'green')) epilog_parts = ["", cli.commands_description(), "", util.color_text("Shortcuts:", attrs=["bold"]), _green(" %(command)s <compiler>") + "Execute a compiler command", " - Example: %(command)s gcc *.c -o a.out", " - Alias for '%(command)s build <compiler>'", _green(" %(command)s <program>") + "Gather data from a program", " - Example: %(command)s ./a.out", " - Alias for '%(command)s trial create <program>'", _green(" %(command)s metrics") + "Show metrics available in the current experiment", " - Alias for '%(command)s target metrics'", _green(" %(command)s select") + "Select configuration objects to create a new experiment", " - Alias for '%(command)s experiment create'", _green(" %(command)s show") + "Show data from the most recent trial", " - Alias for '%(command)s trial show'", "", "See '%(command)s help <subcommand>' for more information on <subcommand>."] epilog = '\n'.join(epilog_parts) % {'color_command': util.color_text(self.command, 'cyan'), 'command': self.command} parser = arguments.get_parser(prog=self.command, usage=usage, description=self.summary, epilog=epilog) parser.add_argument('command', help="See subcommand descriptions below", metavar='<subcommand>') parser.add_argument('options', help="Options to be passed to <subcommand>", metavar='[options]', nargs=arguments.REMAINDER) parser.add_argument('-V', '--version', action='version', version=taucmdr.version_banner()) group = parser.add_mutually_exclusive_group() group.add_argument('-v', '--verbose', help="show debugging messages", const='DEBUG', default=arguments.SUPPRESS, action='store_const') group.add_argument('-q', '--quiet', help="suppress all output except error messages", const='ERROR', default=arguments.SUPPRESS, action='store_const') return parser
def commands_description(package_name=COMMANDS_PACKAGE_NAME): """Builds listing of command names with short description. Args: package_name (str): A dot-seperated string naming the module to search for cli. Returns: str: Help string describing all commands found at or below `root`. """ usage_fmt = USAGE_FORMAT.lower() groups = {} commands = sorted([ i for i in _get_commands(package_name).iteritems() if i[0] != '__module__' ]) for cmd, topcmd in commands: module = topcmd['__module__'] try: command_obj = module.COMMAND except AttributeError: continue descr = command_obj.summary.split('\n')[0] group = command_obj.group if usage_fmt == 'console': line = ' %s%s' % (util.color_text('{:<14}'.format(cmd), 'green'), descr) elif usage_fmt == 'markdown': line = ' %s | %s' % ('{:<28}'.format(cmd), descr) groups.setdefault(group, []).append(line) parts = [] for group, members in groups.iteritems(): title = group.title() + ' Subcommands' if group else 'Subcommands' if usage_fmt == 'console': parts.append(util.color_text(title + ':', attrs=['bold'])) elif usage_fmt == 'markdown': parts.extend([ '', ' ', '{:<30}'.format(title) + ' | Description', '%s:| %s' % ('-' * 30, '-' * len('Description')) ]) parts.extend(members) parts.append('') return '\n'.join(parts)
def _format_args(self, action, default_metavar): _reqired = lambda x: util.color_text(x, 'blue') _optional = lambda x: util.color_text(x, 'cyan') get_metavar = self._metavar_formatter(action, default_metavar) if action.nargs is None: result = _reqired('%s' % get_metavar(1)) elif action.nargs == argparse.OPTIONAL: result = _optional('[%s]' % get_metavar(1)) elif action.nargs == argparse.ZERO_OR_MORE: result = _optional('[%s [%s ...]]' % get_metavar(2)) elif action.nargs == argparse.ONE_OR_MORE: tpl = get_metavar(2) result = _reqired('%s' % tpl[0]) + _optional(' [%s ...]' % tpl[1]) elif action.nargs == argparse.REMAINDER: result = _reqired('...') elif action.nargs == argparse.PARSER: result = _reqired('%s ...' % get_metavar(1)) else: formats = ['%s' for _ in range(action.nargs)] result = ' '.join(formats) % get_metavar(action.nargs) return result
def format_help(self): """Format command line help string.""" formatter = self._get_formatter() formatter.add_usage(self.usage, self._actions, self._mutually_exclusive_groups) formatter.add_text(self.description) for action_group in self._sorted_groups(): title = ' '.join(x[0].upper() + x[1:] for x in action_group.title.split()) formatter.start_section(util.color_text(title, attrs=['bold'])) formatter.add_text(action_group.description) formatter.add_arguments(sorted(action_group._group_actions, key=attrgetter('option_strings'))) formatter.end_section() formatter.add_text(self.epilog) return formatter.format_help()
def _construct_parser(self): key_attr = self.model.key_attribute usage = "%s <%s_%s> [arguments]" % (self.command, self.model_name, key_attr) epilog = util.color_text("WARNING: THIS OPERATION IS NOT REVERSABLE!", 'yellow', attrs=['bold']) parser = arguments.get_parser(prog=self.command, usage=usage, description=self.summary, epilog=epilog) parser.add_argument(key_attr, help="%s of %s configuration to delete" % (key_attr.capitalize(), self.model_name), metavar='<%s_%s>' % (self.model_name, key_attr)) if self.include_storage_flag: arguments.add_storage_flag(parser, "delete", self.model_name) return parser
def commands_description(package_name=COMMANDS_PACKAGE_NAME): """Builds listing of command names with short description. Args: package_name (str): A dot-seperated string naming the module to search for cli. Returns: str: Help string describing all commands found at or below `root`. """ usage_fmt = USAGE_FORMAT.lower() groups = {} commands = sorted([i for i in _get_commands(package_name).iteritems() if i[0] != '__module__']) for cmd, topcmd in commands: module = topcmd['__module__'] try: command_obj = module.COMMAND except AttributeError: continue descr = command_obj.summary.split('\n')[0] group = command_obj.group if usage_fmt == 'console': line = ' %s%s' % (util.color_text('{:<14}'.format(cmd), 'green'), descr) elif usage_fmt == 'markdown': line = ' %s | %s' % ('{:<28}'.format(cmd), descr) groups.setdefault(group, []).append(line) parts = [] for group, members in groups.iteritems(): title = group.title() + ' Subcommands' if group else 'Subcommands' if usage_fmt == 'console': parts.append(util.color_text(title+':', attrs=['bold'])) elif usage_fmt == 'markdown': parts.extend(['', ' ', '{:<30}'.format(title) + ' | Description', '%s:| %s' % ('-'*30, '-'*len('Description'))]) parts.extend(members) parts.append('') return '\n'.join(parts)
def _format_action_invocation(self, action): _red = lambda x: util.color_text(x, 'red') if not action.option_strings: metavar, = self._metavar_formatter(action, action.dest)(1) return _red(metavar) else: parts = [] if action.nargs == 0: parts.extend(_red(x) for x in action.option_strings) else: default = action.dest.upper() args_string = self._format_args(action, default) for option_string in action.option_strings: parts.append('%s %s' % (_red(option_string), args_string)) return ', '.join(parts)
def _construct_parser(self): key_attr = self.model.key_attribute usage = "%s <%s_%s> [arguments]" % (self.command, self.model_name, key_attr) epilog = util.color_text("WARNING: THIS OPERATION IS NOT REVERSABLE!", 'yellow', attrs=['bold']) parser = arguments.get_parser(prog=self.command, usage=usage, description=self.summary, epilog=epilog) parser.add_argument(key_attr, help="%s of %s configuration to delete" % (key_attr.capitalize(), self.model_name), metavar='<%s_%s>' % (self.model_name, key_attr)) if self.include_storage_flag: arguments.add_storage_flag(parser, "delete", self.model_name) return parser
def dashboard_format(self, records): """Format modeled records in dashboard format. Args: records: Modeled records to format. Returns: str: Record data in dashboard format. """ self.logger.debug("Dashboard format") title = util.hline( self.title_fmt % { 'model_name': records[0].name.capitalize(), 'storage_path': records[0].storage }, 'cyan') expr = Project.selected().experiment() subtitle = util.color_text("Selected experiment: ", 'cyan') + expr['name'] header_row = [col['header'] for col in self.dashboard_columns] rows = [header_row] for record in records: populated = record.populate() row = [] for col in self.dashboard_columns: if 'value' in col: try: cell = populated[col['value']] except KeyError: cell = 'N/A' elif 'yesno' in col: cell = 'Yes' if populated.get(col['yesno'], False) else 'No' elif 'function' in col: cell = col['function'](populated) else: raise InternalError("Invalid column definition: %s" % col) row.append(cell) rows.append(row) table = Texttable(logger.LINE_WIDTH) table.set_cols_align( [col.get('align', 'c') for col in self.dashboard_columns]) table.add_rows(rows) return [title, table.draw(), '', subtitle, '']
def dashboard_format(self, records): """Format modeled records in dashboard format. Args: records: Modeled records to format. Returns: str: Record data in dashboard format. """ self.logger.debug("Dashboard format") title = util.hline(self.title_fmt % {'model_name': records[0].name.capitalize(), 'storage_path': records[0].storage}, 'cyan') expr = Project.selected().experiment() subtitle = util.color_text("Selected experiment: ", 'cyan') + expr['name'] header_row = [col['header'] for col in self.dashboard_columns] rows = [header_row] for record in records: populated = record.populate() row = [] for col in self.dashboard_columns: if 'value' in col: try: cell = populated[col['value']] except KeyError: cell = 'N/A' elif 'yesno' in col: cell = 'Yes' if populated.get(col['yesno'], False) else 'No' elif 'function' in col: cell = col['function'](populated) else: raise InternalError("Invalid column definition: %s" % col) row.append(cell) rows.append(row) table = Texttable(logger.LINE_WIDTH) table.set_cols_align([col.get('align', 'c') for col in self.dashboard_columns]) table.add_rows(rows) return [title, table.draw(), '', subtitle, '']
def start_section(self, heading): return super(ConsoleHelpFormatter, self).start_section( util.color_text(heading, attrs=['bold']))
def _format_optional(self, argstr): return util.color_text(argstr, 'red')
def _draw_bar(self, percent, width, char, *args, **kwargs): from taucmdr import util bar_on = max(int(percent*width), 1) bar_off = width - bar_on self._line_append(util.color_text(char*bar_on, *args, **kwargs)) self._line_append(' '*bar_off)
def _format_requred_arg(self, argstr): return util.color_text(argstr, 'blue')
def _format_optional(self, argstr): return util.color_text(argstr, 'red')
def start_section(self, heading): return super(ConsoleHelpFormatter, self).start_section(util.color_text(heading, attrs=['bold']))
def _format_requred_arg(self, argstr): return util.color_text(argstr, 'blue')
def _format_optional_arg(self, argstr): return util.color_text(argstr, 'cyan')
def _format_optional_arg(self, argstr): return util.color_text(argstr, 'cyan')