aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Christie2011-03-13 17:08:46 +0000
committerTom Christie2011-03-13 17:08:46 +0000
commitbed7d8c3a99425b8dfa5c5a9c6b1d49a46f5284f (patch)
treed3ad16683a727ea847ca807660419e3f290929cb
parentd6e7e95d95e7367f0d999c14d874d810a028a177 (diff)
downloaddjango-rest-framework-bed7d8c3a99425b8dfa5c5a9c6b1d49a46f5284f.tar.bz2
tox, runcoverage, and setup.py test
-rw-r--r--.hgignore4
-rw-r--r--README16
-rw-r--r--djangorestframework/runtests/__init__.py (renamed from testproject/__init__.py)0
-rw-r--r--djangorestframework/runtests/runcoverage.py53
-rw-r--r--djangorestframework/runtests/runtests.py35
-rw-r--r--djangorestframework/runtests/settings.py (renamed from testproject/settings.py)0
-rw-r--r--djangorestframework/runtests/urls.py7
-rw-r--r--setup.py10
-rwxr-xr-xtestproject/manage.py11
-rw-r--r--testproject/urls.py16
-rw-r--r--tox.ini40
11 files changed, 160 insertions, 32 deletions
diff --git a/.hgignore b/.hgignore
index e5154a84..b02605e9 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 a7dc3e92..d74aa474 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
index e69de29b..e69de29b 100644
--- a/testproject/__init__.py
+++ b/djangorestframework/runtests/__init__.py
diff --git a/djangorestframework/runtests/runcoverage.py b/djangorestframework/runtests/runcoverage.py
new file mode 100644
index 00000000..1deb1080
--- /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 00000000..a3cdfa67
--- /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
index 2bf955aa..2bf955aa 100644
--- a/testproject/settings.py
+++ b/djangorestframework/runtests/settings.py
diff --git a/djangorestframework/runtests/urls.py b/djangorestframework/runtests/urls.py
new file mode 100644
index 00000000..45555813
--- /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 0015f0d9..4c5ff054 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 5e78ea97..00000000
--- 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 d1312789..00000000
--- 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 00000000..b586ab07
--- /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/
+