Source code for asv.commands
# Licensed under a 3-clause BSD style license - see LICENSE.rst
import abc
import argparse
import sys
from asv import config, util
from . import common_args
# This list is ordered in order of average workflow
[docs]
command_order = [
'Quickstart',
'Machine',
'Setup',
'Run',
'Continuous',
'Find',
'Rm',
'Publish',
'Preview',
'Profile',
'Update',
'Show',
'Compare',
]
[docs]
class Command(abc.ABC):
@classmethod
@abc.abstractmethod
[docs]
def setup_arguments(cls, subparsers):
"""
Method to add the parser and arguments of the command.
In most cases, `subparser.add_parser(cmd_name)` should be called to
add the command (where `cmd_name` is for example `run` or `continuous`).
And then call `add_argument` to the returned parser, to add the command
arguments.
"""
@classmethod
[docs]
def run_from_args(cls, args):
from ..plugin_manager import plugin_manager
conf = config.Config.load(args.config)
for plugin in conf.plugins:
plugin_manager.import_plugin(plugin)
return cls.run_from_conf_args(conf, args)
@classmethod
@abc.abstractmethod
[docs]
def run_from_conf_args(cls, conf, args):
"""
Call the run method (i.e. `cls.run`) with the right arguments from
`conf` and `args`. In most cases this is just something like
`clf.run(conf=conf, my_arg_1=args.my_arg_1, my_arg_2=args.my_arg_2, ...)`.
"""
[docs]
def make_argparser():
"""
The top-level entry point for the asv script.
Most of the real work is handled by the subcommands in the
commands subpackage.
"""
def help(args):
parser.print_help()
sys.exit(0)
parser = argparse.ArgumentParser(
"asv", description="Airspeed Velocity: Simple benchmarking tool for Python"
)
common_args.add_global_arguments(parser, suppress_defaults=False)
subparsers = parser.add_subparsers(title='subcommands', description='valid subcommands')
help_parser = subparsers.add_parser("help", help="Display usage information")
help_parser.set_defaults(func=help)
commands = {x.__name__: x for x in util.iter_subclasses(Command)}
for command in command_order:
subparser = commands[str(command)].setup_arguments(subparsers)
common_args.add_global_arguments(subparser)
del commands[command]
for name, command in sorted(commands.items()):
subparser = command.setup_arguments(subparsers)
common_args.add_global_arguments(subparser)
return parser, subparsers
[docs]
def _make_docstring():
parser, subparsers = make_argparser()
lines = []
for p in subparsers.choices.values():
lines.append(f".. _cmd-{p.prog.replace(' ', '-')}:")
lines.append('')
lines.append(p.prog)
lines.append('-' * len(p.prog))
lines.append('::')
lines.append('')
lines.extend(' ' + x for x in p.format_help().splitlines())
lines.append('')
return '\n'.join(lines)