Пример #1
0
 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)
Пример #2
0
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)
Пример #3
0
 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)
Пример #4
0
 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
Пример #5
0
    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
Пример #6
0
    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
Пример #7
0
    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
Пример #8
0
 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
Пример #9
0
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)
Пример #10
0
 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
Пример #11
0
 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()
Пример #12
0
 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
Пример #13
0
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)
Пример #14
0
    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)
Пример #15
0
 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
Пример #16
0
    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, '']
Пример #17
0
    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, '']
Пример #18
0
 def start_section(self, heading):
     return super(ConsoleHelpFormatter, self).start_section(
         util.color_text(heading, attrs=['bold']))
Пример #19
0
 def _format_optional(self, argstr):
     return util.color_text(argstr, 'red')
Пример #20
0
 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)
Пример #21
0
 def _format_requred_arg(self, argstr):
     return util.color_text(argstr, 'blue')
Пример #22
0
 def _format_optional(self, argstr):
     return util.color_text(argstr, 'red')
Пример #23
0
 def start_section(self, heading):
     return super(ConsoleHelpFormatter, self).start_section(util.color_text(heading, attrs=['bold']))
Пример #24
0
 def _format_requred_arg(self, argstr):
     return util.color_text(argstr, 'blue')
Пример #25
0
 def _format_optional_arg(self, argstr):
     return util.color_text(argstr, 'cyan')
Пример #26
0
 def _format_optional_arg(self, argstr):
     return util.color_text(argstr, 'cyan')