From bed7d8c3a99425b8dfa5c5a9c6b1d49a46f5284f Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Sun, 13 Mar 2011 17:08:46 +0000 Subject: [PATCH] tox, runcoverage, and setup.py test --- .hgignore | 4 ++ README | 16 ++++-- .../runtests}/__init__.py | 0 djangorestframework/runtests/runcoverage.py | 53 +++++++++++++++++++ djangorestframework/runtests/runtests.py | 35 ++++++++++++ .../runtests}/settings.py | 0 djangorestframework/runtests/urls.py | 7 +++ setup.py | 10 +++- testproject/manage.py | 11 ---- testproject/urls.py | 16 ------ tox.ini | 40 ++++++++++++++ 11 files changed, 160 insertions(+), 32 deletions(-) rename {testproject => djangorestframework/runtests}/__init__.py (100%) create mode 100644 djangorestframework/runtests/runcoverage.py create mode 100644 djangorestframework/runtests/runtests.py rename {testproject => djangorestframework/runtests}/settings.py (100%) create mode 100644 djangorestframework/runtests/urls.py delete mode 100755 testproject/manage.py delete mode 100644 testproject/urls.py create mode 100644 tox.ini diff --git a/.hgignore b/.hgignore index e5154a849..b02605e93 100644 --- a/.hgignore +++ b/.hgignore @@ -6,12 +6,16 @@ syntax: glob env docs/build html +htmlcov examples/media/pygments/* examples/media/objectstore/* build/* dist/* +djangorestframework.egg-info/* MANIFEST .project .pydevproject .settings .cache +.coverage +.tox diff --git a/README b/README index a7dc3e925..d74aa474b 100644 --- a/README +++ b/README @@ -8,9 +8,14 @@ pip install -r requirements.txt # django # To run the tests... -cd testproject -export PYTHONPATH=.. -python manage.py test djangorestframework +export PYTHONPATH=. # Ensure djangorestframework is on the PYTHONPATH +python djangorestframework/runtests/runtests.py + + +# To run the test coverage report... + +export PYTHONPATH=. # Ensure djangorestframework is on the PYTHONPATH +python djangorestframework/runtests/runcoverage.py # To run the examples... @@ -24,3 +29,8 @@ python manage.py runserver pip install -r docs/requirements.txt # sphinx sphinx-build -c docs -b html -d docs/build docs html + +# To run the tests against the full set of supported configurations + +deactivate # Ensure we are not currently running in a virtualenv +tox diff --git a/testproject/__init__.py b/djangorestframework/runtests/__init__.py similarity index 100% rename from testproject/__init__.py rename to djangorestframework/runtests/__init__.py diff --git a/djangorestframework/runtests/runcoverage.py b/djangorestframework/runtests/runcoverage.py new file mode 100644 index 000000000..1deb10805 --- /dev/null +++ b/djangorestframework/runtests/runcoverage.py @@ -0,0 +1,53 @@ +""" +Useful tool to run the test suite for djangorestframework 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 +os.environ['DJANGO_SETTINGS_MODULE'] = 'djangorestframework.runtests.settings' + +from django.conf import settings +from django.test.utils import get_runner +from coverage import coverage +from itertools import chain +import djangorestframework + +def main(): + """Run the tests for djangorestframework and generate a coverage report.""" + + # Discover the list of all modules that we should test coverage for + project_dir = os.path.dirname(djangorestframework.__file__) + cov_files = [] + for (path, dirs, files) in os.walk(project_dir): + # Drop tests and runtests directories from the test coverage report + if os.path.basename(path) == 'tests' or os.path.basename(path) == 'runtests': + continue + cov_files.extend([os.path.join(path, file) for file in files if file.endswith('.py')]) + + cov = coverage() + cov.erase() + cov.start() + 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 + ) + failures = TestRunner(['djangorestframework']) + else: + test_runner = TestRunner() + failures = test_runner.run_tests(['djangorestframework']) + + cov.stop() + cov.report(cov_files) + sys.exit(failures) + +if __name__ == '__main__': + main() diff --git a/djangorestframework/runtests/runtests.py b/djangorestframework/runtests/runtests.py new file mode 100644 index 000000000..a3cdfa67d --- /dev/null +++ b/djangorestframework/runtests/runtests.py @@ -0,0 +1,35 @@ +''' +Created on Mar 10, 2011 + +@author: tomchristie +''' +# 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 +os.environ['DJANGO_SETTINGS_MODULE'] = 'djangorestframework.runtests.settings' + +from django.conf import settings +from django.test.utils import get_runner + +def main(): + 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 + ) + failures = TestRunner(['djangorestframework']) + else: + test_runner = TestRunner() + failures = test_runner.run_tests(['djangorestframework']) + + sys.exit(failures) + +if __name__ == '__main__': + main() diff --git a/testproject/settings.py b/djangorestframework/runtests/settings.py similarity index 100% rename from testproject/settings.py rename to djangorestframework/runtests/settings.py diff --git a/djangorestframework/runtests/urls.py b/djangorestframework/runtests/urls.py new file mode 100644 index 000000000..455558138 --- /dev/null +++ b/djangorestframework/runtests/urls.py @@ -0,0 +1,7 @@ +""" +Blank URLConf just to keep runtests.py happy. +""" +from django.conf.urls.defaults import * + +urlpatterns = patterns('', +) \ No newline at end of file diff --git a/setup.py b/setup.py index 0015f0d9b..4c5ff054e 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,7 @@ #!/usr/bin/env/python # -*- coding: utf-8 -*- -from distutils.core import setup +from setuptools import setup setup( name = "djangorestframework", @@ -14,9 +14,11 @@ setup( author_email = 'tom@tomchristie.com', packages = ['djangorestframework', 'djangorestframework.templatetags', - 'djangorestframework.tests'], + 'djangorestframework.tests', + 'djangorestframework.runtests'], package_dir={'djangorestframework': 'djangorestframework'}, package_data = {'djangorestframework': ['templates/*', 'static/*']}, + test_suite = 'djangorestframework.runtests.runtests.main', classifiers = [ 'Development Status :: 4 - Beta', 'Environment :: Web Environment', @@ -29,3 +31,7 @@ setup( ] ) +import os, shutil +shutil.rmtree(os.path.join(os.path.dirname(__file__), 'djangorestframework.egg-info'), True) + + diff --git a/testproject/manage.py b/testproject/manage.py deleted file mode 100755 index 5e78ea979..000000000 --- a/testproject/manage.py +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env python -from django.core.management import execute_manager -try: - import settings # Assumed to be in the same directory. -except ImportError: - import sys - sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__) - sys.exit(1) - -if __name__ == "__main__": - execute_manager(settings) diff --git a/testproject/urls.py b/testproject/urls.py deleted file mode 100644 index d13127899..000000000 --- a/testproject/urls.py +++ /dev/null @@ -1,16 +0,0 @@ -from django.conf.urls.defaults import * - -# Uncomment the next two lines to enable the admin: -# from django.contrib import admin -# admin.autodiscover() - -urlpatterns = patterns('', - # Example: - # (r'^testproject/', include('testproject.foo.urls')), - - # Uncomment the admin/doc line below to enable admin documentation: - # (r'^admin/doc/', include('django.contrib.admindocs.urls')), - - # Uncomment the next line to enable the admin: - # (r'^admin/', include(admin.site.urls)), -) diff --git a/tox.ini b/tox.ini new file mode 100644 index 000000000..b586ab074 --- /dev/null +++ b/tox.ini @@ -0,0 +1,40 @@ +[tox] +envlist= + py25-django12, py26-django12, py27-django12, py25-django13, py26-django13, py27-django13 + +[testenv] +commands= + python setup.py test + +[testenv:py25-django12] +basepython=python2.5 +deps= + django==1.2.4 + simplejson + +[testenv:py26-django12] +basepython=python2.6 +deps= + django==1.2.4 + +[testenv:py27-django12] +basepython=python2.7 +deps= + django==1.2.4 + +[testenv:py25-django13] +basepython=python2.5 +deps= + http://www.djangoproject.com/download/1.3-rc-1/tarball/ + simplejson + +[testenv:py26-django13] +basepython=python2.6 +deps= + http://www.djangoproject.com/download/1.3-rc-1/tarball/ + +[testenv:py27-django13] +basepython=python2.7 +deps= + http://www.djangoproject.com/download/1.3-rc-1/tarball/ +