# -*- coding: utf-8 -*-
# Copyright (c) 2013-2014 Simon Jagoe
# All rights reserved.
#
# This software may be modified and distributed under the terms
# of the 3-clause BSD license. See the LICENSE.txt file for details.
from __future__ import absolute_import, unicode_literals
import argparse
import os
import haas
from .loader import Loader
from .plugin_context import PluginContext
from .plugin_manager import PluginManager
from .result import ResultCollector
from .utils import configure_logging
[docs]def create_argument_parser():
"""Creates the argument parser for haas.
"""
parser = argparse.ArgumentParser(prog='haas')
parser.add_argument('--version', action='version',
version='%(prog)s {0}'.format(haas.__version__))
verbosity = parser.add_mutually_exclusive_group()
verbosity.add_argument('-v', '--verbose', action='store_const', default=1,
dest='verbosity', const=2, help='Verbose output')
verbosity.add_argument('-q', '--quiet', action='store_const', const=0,
dest='verbosity', help='Quiet output')
parser.add_argument('-f', '--failfast', action='store_true', default=False,
help='Stop on first fail or error')
parser.add_argument('-c', '--catch', dest='catch_interrupt',
action='store_true', default=False,
help=('(Ignored) Catch ctrl-C and display results so '
'far'))
parser.add_argument('-b', '--buffer', action='store_true', default=False,
help='Buffer stdout and stderr during tests')
parser.add_argument(
'start', nargs='*', default=[os.getcwd()],
help=('One or more directories or dotted package/module names from '
'which to start searching for tests'))
parser.add_argument('-p', '--pattern', default='test*.py',
help="Pattern to match tests ('test*.py' default)")
parser.add_argument('-t', '--top-level-directory', default=None,
help=('Top level directory of project (defaults to '
'start directory)'))
_add_log_level_option(parser)
return parser
def _create_log_level_parser():
parser = argparse.ArgumentParser(prog='haas', add_help=False)
_add_log_level_option(parser)
return parser
def _add_log_level_option(parser):
parser.add_argument('--log-level', default=None,
type=lambda level_name: level_name.lower(),
choices=['critical', 'fatal', 'error', 'warning',
'info', 'debug'],
help='Log level for haas logging')
[docs]class HaasApplication(object):
"""Main haas application entry-point.
"""
def __init__(self, argv, **kwargs):
super(HaasApplication, self).__init__(**kwargs)
self.argv = argv
initial_parser = _create_log_level_parser()
initial_args, _ = initial_parser.parse_known_args(argv[1:])
if initial_args.log_level is not None:
configure_logging(initial_args.log_level)
self.parser = create_argument_parser()
[docs] def run(self, plugin_manager=None):
"""Run the haas test runner.
This will load and configure the selected plugins, set up the
environment and begin test discovery, loading and running.
Parameters
----------
plugin_manager : haas.plugin_manager.PluginManager
[Optional] Override the use of the default plugin manager.
"""
if plugin_manager is None:
plugin_manager = PluginManager()
plugin_manager.add_plugin_arguments(self.parser)
args = self.parser.parse_args(self.argv[1:])
environment_plugins = plugin_manager.get_enabled_hook_plugins(
plugin_manager.ENVIRONMENT_HOOK, args)
runner = plugin_manager.get_driver(
plugin_manager.TEST_RUNNER, args)
with PluginContext(environment_plugins):
loader = Loader()
discoverer = plugin_manager.get_driver(
plugin_manager.TEST_DISCOVERY, args, loader=loader)
suites = [
discoverer.discover(
start=start,
top_level_directory=args.top_level_directory,
pattern=args.pattern,
)
for start in args.start
]
if len(suites) == 1:
suite = suites[0]
else:
suite = loader.create_suite(suites)
test_count = suite.countTestCases()
result_handlers = plugin_manager.get_enabled_hook_plugins(
plugin_manager.RESULT_HANDLERS, args, test_count=test_count)
result_collector = ResultCollector(
buffer=args.buffer, failfast=args.failfast)
for result_handler in result_handlers:
result_collector.add_result_handler(result_handler)
result = runner.run(result_collector, suite)
return not result.wasSuccessful()