From bed7d8c3a99425b8dfa5c5a9c6b1d49a46f5284f Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Sun, 13 Mar 2011 17:08:46 +0000 Subject: tox, runcoverage, and setup.py test --- .hgignore | 4 ++ README | 16 ++++- djangorestframework/runtests/__init__.py | 0 djangorestframework/runtests/runcoverage.py | 53 ++++++++++++++++ djangorestframework/runtests/runtests.py | 35 +++++++++++ djangorestframework/runtests/settings.py | 97 +++++++++++++++++++++++++++++ djangorestframework/runtests/urls.py | 7 +++ setup.py | 10 ++- testproject/__init__.py | 0 testproject/manage.py | 11 ---- testproject/settings.py | 97 ----------------------------- testproject/urls.py | 16 ----- tox.ini | 40 ++++++++++++ 13 files changed, 257 insertions(+), 129 deletions(-) create mode 100644 djangorestframework/runtests/__init__.py create mode 100644 djangorestframework/runtests/runcoverage.py create mode 100644 djangorestframework/runtests/runtests.py create mode 100644 djangorestframework/runtests/settings.py create mode 100644 djangorestframework/runtests/urls.py delete mode 100644 testproject/__init__.py delete mode 100755 testproject/manage.py delete mode 100644 testproject/settings.py delete mode 100644 testproject/urls.py create mode 100644 tox.ini 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/djangorestframework/runtests/__init__.py b/djangorestframework/runtests/__init__.py new file mode 100644 index 00000000..e69de29b 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/djangorestframework/runtests/settings.py b/djangorestframework/runtests/settings.py new file mode 100644 index 00000000..2bf955aa --- /dev/null +++ b/djangorestframework/runtests/settings.py @@ -0,0 +1,97 @@ +# Django settings for testproject project. + +DEBUG = True +TEMPLATE_DEBUG = DEBUG + +ADMINS = ( + # ('Your Name', 'your_email@domain.com'), +) + +MANAGERS = ADMINS + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. + 'NAME': 'sqlite.db', # Or path to database file if using sqlite3. + 'USER': '', # Not used with sqlite3. + 'PASSWORD': '', # Not used with sqlite3. + 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. + 'PORT': '', # Set to empty string for default. Not used with sqlite3. + } +} + +# Local time zone for this installation. Choices can be found here: +# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name +# although not all choices may be available on all operating systems. +# On Unix systems, a value of None will cause Django to use the same +# timezone as the operating system. +# If running in a Windows environment this must be set to the same as your +# system time zone. +TIME_ZONE = 'Europe/London' + +# Language code for this installation. All choices can be found here: +# http://www.i18nguy.com/unicode/language-identifiers.html +LANGUAGE_CODE = 'en-uk' + +SITE_ID = 1 + +# If you set this to False, Django will make some optimizations so as not +# to load the internationalization machinery. +USE_I18N = True + +# If you set this to False, Django will not format dates, numbers and +# calendars according to the current locale +USE_L10N = True + +# Absolute filesystem path to the directory that will hold user-uploaded files. +# Example: "/home/media/media.lawrence.com/" +MEDIA_ROOT = '' + +# URL that handles the media served from MEDIA_ROOT. Make sure to use a +# trailing slash if there is a path component (optional in other cases). +# Examples: "http://media.lawrence.com", "http://example.com/media/" +MEDIA_URL = '' + +# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a +# trailing slash. +# Examples: "http://foo.com/media/", "/media/". +ADMIN_MEDIA_PREFIX = '/media/' + +# Make this unique, and don't share it with anybody. +SECRET_KEY = 'u@x-aj9(hoh#rb-^ymf#g2jx_hp0vj7u5#b@ag1n^seu9e!%cy' + +# List of callables that know how to import templates from various sources. +TEMPLATE_LOADERS = ( + 'django.template.loaders.filesystem.Loader', + 'django.template.loaders.app_directories.Loader', +# 'django.template.loaders.eggs.Loader', +) + +MIDDLEWARE_CLASSES = ( + 'django.middleware.common.CommonMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', +) + +ROOT_URLCONF = 'urls' + +TEMPLATE_DIRS = ( + # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". + # Always use forward slashes, even on Windows. + # Don't forget to use absolute paths, not relative paths. +) + +INSTALLED_APPS = ( + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.sites', + 'django.contrib.messages', + # Uncomment the next line to enable the admin: + # 'django.contrib.admin', + # Uncomment the next line to enable admin documentation: + # 'django.contrib.admindocs', + 'djangorestframework', +) 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/__init__.py b/testproject/__init__.py deleted file mode 100644 index e69de29b..00000000 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/settings.py b/testproject/settings.py deleted file mode 100644 index 2bf955aa..00000000 --- a/testproject/settings.py +++ /dev/null @@ -1,97 +0,0 @@ -# Django settings for testproject project. - -DEBUG = True -TEMPLATE_DEBUG = DEBUG - -ADMINS = ( - # ('Your Name', 'your_email@domain.com'), -) - -MANAGERS = ADMINS - -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. - 'NAME': 'sqlite.db', # Or path to database file if using sqlite3. - 'USER': '', # Not used with sqlite3. - 'PASSWORD': '', # Not used with sqlite3. - 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. - 'PORT': '', # Set to empty string for default. Not used with sqlite3. - } -} - -# Local time zone for this installation. Choices can be found here: -# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name -# although not all choices may be available on all operating systems. -# On Unix systems, a value of None will cause Django to use the same -# timezone as the operating system. -# If running in a Windows environment this must be set to the same as your -# system time zone. -TIME_ZONE = 'Europe/London' - -# Language code for this installation. All choices can be found here: -# http://www.i18nguy.com/unicode/language-identifiers.html -LANGUAGE_CODE = 'en-uk' - -SITE_ID = 1 - -# If you set this to False, Django will make some optimizations so as not -# to load the internationalization machinery. -USE_I18N = True - -# If you set this to False, Django will not format dates, numbers and -# calendars according to the current locale -USE_L10N = True - -# Absolute filesystem path to the directory that will hold user-uploaded files. -# Example: "/home/media/media.lawrence.com/" -MEDIA_ROOT = '' - -# URL that handles the media served from MEDIA_ROOT. Make sure to use a -# trailing slash if there is a path component (optional in other cases). -# Examples: "http://media.lawrence.com", "http://example.com/media/" -MEDIA_URL = '' - -# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a -# trailing slash. -# Examples: "http://foo.com/media/", "/media/". -ADMIN_MEDIA_PREFIX = '/media/' - -# Make this unique, and don't share it with anybody. -SECRET_KEY = 'u@x-aj9(hoh#rb-^ymf#g2jx_hp0vj7u5#b@ag1n^seu9e!%cy' - -# List of callables that know how to import templates from various sources. -TEMPLATE_LOADERS = ( - 'django.template.loaders.filesystem.Loader', - 'django.template.loaders.app_directories.Loader', -# 'django.template.loaders.eggs.Loader', -) - -MIDDLEWARE_CLASSES = ( - 'django.middleware.common.CommonMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', -) - -ROOT_URLCONF = 'urls' - -TEMPLATE_DIRS = ( - # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". - # Always use forward slashes, even on Windows. - # Don't forget to use absolute paths, not relative paths. -) - -INSTALLED_APPS = ( - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.sites', - 'django.contrib.messages', - # Uncomment the next line to enable the admin: - # 'django.contrib.admin', - # Uncomment the next line to enable admin documentation: - # 'django.contrib.admindocs', - 'djangorestframework', -) 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/ + -- cgit v1.2.3