--- /dev/null
+# Copyright (c) Microsoft Corporation. All rights reserved.
+# Licensed under the MIT License.
+
+from __future__ import absolute_import
+
+import argparse
+import sys
+
+from . import pytest, report
+from .errors import UnsupportedToolError, UnsupportedCommandError
+
+
+TOOLS = {
+ 'pytest': {
+ '_add_subparser': pytest.add_cli_subparser,
+ 'discover': pytest.discover,
+ },
+ }
+REPORTERS = {
+ 'discover': report.report_discovered,
+ }
+
+
+
+def parse_args(
+ argv=sys.argv[1:],
+ prog=sys.argv[0],
+ ):
+ """
+ Return the subcommand & tool to run, along with its args.
+
+ This defines the standard CLI for the different testing frameworks.
+ """
+ parser = argparse.ArgumentParser(
+ description='Run Python testing operations.',
+ prog=prog,
+ )
+ cmdsubs = parser.add_subparsers(dest='cmd')
+
+ # Add "run" and "debug" subcommands when ready.
+ for cmdname in ['discover']:
+ sub = cmdsubs.add_parser(cmdname)
+ subsubs = sub.add_subparsers(dest='tool')
+ for toolname in sorted(TOOLS):
+ try:
+ add_subparser = TOOLS[toolname]['_add_subparser']
+ except KeyError:
+ continue
+ subsub = add_subparser(cmdname, toolname, subsubs)
+ if cmdname == 'discover':
+ subsub.add_argument('--simple', action='store_true')
+ subsub.add_argument('--no-hide-stdio', dest='hidestdio',
+ action='store_false')
+ subsub.add_argument('--pretty', action='store_true')
+
+ # Parse the args!
+ if '--' in argv:
+ seppos = argv.index('--')
+ toolargs = argv[seppos + 1:]
+ argv = argv[:seppos]
+ else:
+ toolargs = []
+ args = parser.parse_args(argv)
+ ns = vars(args)
+
+ cmd = ns.pop('cmd')
+ if not cmd:
+ parser.error('missing command')
+
+ tool = ns.pop('tool')
+ if not tool:
+ parser.error('missing tool')
+
+ return tool, cmd, ns, toolargs
+
+
+def main(toolname, cmdname, subargs, toolargs,
+ _tools=TOOLS, _reporters=REPORTERS):
+ try:
+ tool = _tools[toolname]
+ except KeyError:
+ raise UnsupportedToolError(toolname)
+
+ try:
+ run = tool[cmdname]
+ report_result = _reporters[cmdname]
+ except KeyError:
+ raise UnsupportedCommandError(cmdname)
+
+ parents, result = run(toolargs, **subargs)
+ report_result(result, parents,
+ **subargs
+ )
+
+
+if __name__ == '__main__':
+ tool, cmd, subargs, toolargs = parse_args()
+ main(tool, cmd, subargs, toolargs)