2012-09-20 16:06:27 +04:00
|
|
|
#!/usr/bin/env python
|
|
|
|
"""
|
|
|
|
Useful tool to run the test suite for rest_framework and generate a coverage report.
|
|
|
|
"""
|
|
|
|
|
|
|
|
# http://ericholscher.com/blog/2009/jun/29/enable-setuppy-test-your-django-apps/
|
|
|
|
# http://www.travisswicegood.com/2010/01/17/django-virtualenv-pip-and-fabric/
|
|
|
|
# http://code.djangoproject.com/svn/django/trunk/tests/runtests.py
|
|
|
|
import os
|
|
|
|
import sys
|
2012-12-30 12:06:04 +04:00
|
|
|
|
|
|
|
# fix sys path so we don't need to setup PYTHONPATH
|
|
|
|
sys.path.append(os.path.join(os.path.dirname(__file__), "../.."))
|
2012-09-20 16:06:27 +04:00
|
|
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'rest_framework.runtests.settings'
|
|
|
|
|
|
|
|
from coverage import coverage
|
|
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
"""Run the tests for rest_framework and generate a coverage report."""
|
|
|
|
|
|
|
|
cov = coverage()
|
|
|
|
cov.erase()
|
|
|
|
cov.start()
|
|
|
|
|
|
|
|
from django.conf import settings
|
|
|
|
from django.test.utils import get_runner
|
|
|
|
TestRunner = get_runner(settings)
|
|
|
|
|
|
|
|
if hasattr(TestRunner, 'func_name'):
|
|
|
|
# Pre 1.2 test runners were just functions,
|
|
|
|
# and did not support the 'failfast' option.
|
|
|
|
import warnings
|
|
|
|
warnings.warn(
|
|
|
|
'Function-based test runners are deprecated. Test runners should be classes with a run_tests() method.',
|
|
|
|
DeprecationWarning
|
|
|
|
)
|
2012-11-03 00:56:51 +04:00
|
|
|
failures = TestRunner(['tests'])
|
2012-09-20 16:06:27 +04:00
|
|
|
else:
|
|
|
|
test_runner = TestRunner()
|
2012-11-03 00:56:51 +04:00
|
|
|
failures = test_runner.run_tests(['tests'])
|
2012-09-20 16:06:27 +04:00
|
|
|
cov.stop()
|
|
|
|
|
|
|
|
# Discover the list of all modules that we should test coverage for
|
|
|
|
import rest_framework
|
|
|
|
|
|
|
|
project_dir = os.path.dirname(rest_framework.__file__)
|
|
|
|
cov_files = []
|
|
|
|
|
|
|
|
for (path, dirs, files) in os.walk(project_dir):
|
|
|
|
# Drop tests and runtests directories from the test coverage report
|
2012-09-28 19:01:02 +04:00
|
|
|
if os.path.basename(path) in ['tests', 'runtests', 'migrations']:
|
2012-09-20 16:06:27 +04:00
|
|
|
continue
|
|
|
|
|
2013-02-12 12:57:59 +04:00
|
|
|
# Drop the compat and six modules from coverage, since we're not interested in the coverage
|
|
|
|
# of modules which are specifically for resolving environment dependant imports.
|
2012-09-20 16:06:27 +04:00
|
|
|
# (Because we'll end up getting different coverage reports for it for each environment)
|
|
|
|
if 'compat.py' in files:
|
|
|
|
files.remove('compat.py')
|
|
|
|
|
2013-02-12 12:57:59 +04:00
|
|
|
if 'six.py' in files:
|
|
|
|
files.remove('six.py')
|
|
|
|
|
2012-12-30 12:06:04 +04:00
|
|
|
# Same applies to template tags module.
|
|
|
|
# This module has to include branching on Django versions,
|
|
|
|
# so it's never possible for it to have full coverage.
|
|
|
|
if 'rest_framework.py' in files:
|
|
|
|
files.remove('rest_framework.py')
|
|
|
|
|
2012-09-20 16:06:27 +04:00
|
|
|
cov_files.extend([os.path.join(path, file) for file in files if file.endswith('.py')])
|
|
|
|
|
|
|
|
cov.report(cov_files)
|
|
|
|
if '--html' in sys.argv:
|
|
|
|
cov.html_report(cov_files, directory='coverage')
|
|
|
|
sys.exit(failures)
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
main()
|