Skip to content
Browse files

refactoring, updated docs and version bumped to 0.3

  • Loading branch information...
1 parent eea0e72 commit 7379eb0651fcd9f687446341f03d8ce9ef859aea Martin Rusev committed Jun 30, 2011
View
4 LICENSE.txt
@@ -1,4 +1,4 @@
-Copyright (c) 2010, Martin Rusev
+Copyright (c) 2010-2011, Martin Rusev
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -25,4 +25,4 @@ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
View
83 README.md
@@ -1,83 +0,0 @@
-# django-better-tests
-
-
-This is a collection of commands for your django projects, that separates
-test database creation from the actual test run
-
-
-The advantages of using this over 'manage.py test' is that you control both
-the database creation and the test run
-
-
-## Installation
-
-
-1. Either download the tarball and run ``python setup.py install``,
-
-2. Add ``django_better_tests`` to your INSTALLED_APPS in settings.py:
-
-
- INSTALLED_APPS = ('django_better_tests')
-
-
-
-3. Add test database details in settings.py
-
-
- DATABASES = {
- 'default':{
- 'ENGINE':''},
- 'test':{
- 'ENGINE': '',
- 'NAME': 'test_database',
- }
- }
-
-
-4. Then set TEST_RUNNER in settings.py:
-
- TEST_RUNNER = 'django_better_tests.NoseTestSuiteRunner'
-
-
-
-## Usage
-
-
-Once installed, using the new test suite runner replacement is easy. Create your test database with::
-
- python manage.py create_test_db
-
-After that run your tests with
-
- python manage.py quick_test
-
-
-And finally if you want destroy the test database with
-
- python manage.py destroy_test_db
-
-
-
-## Alternative usage
-
-
-You can use just the quick_test command and manualy update the database only when needed.
-
-Manual commands
-
- python manage.py syncdb --database=test
- python manage.py migrate --database=test
-
-and after that only
-
- python manage.py quick_test
-
-
-
-## Requirements
-
-
-Django 1.2+
-
-nose
-
View
114 README.rst
@@ -0,0 +1,114 @@
+=================
+django-quick-test
+=================
+
+Django quick test is a custom nose based test runner that
+separates testing and test related database manipulations.
+
+
+Usualy running this command instead of the default ``manage.py test``
+will give you 10-15 times speed boost. So you will be able to run
+your test suite in seconds instead of minutes.
+
+===============
+ Installation
+===============
+
+
+1. Download the tarball and run ``python setup.py install``
+
+2. Add ``quick_test`` to your INSTALLED_APPS list in settings.py
+
+
+::
+
+ INSTALLED_APPS = ('quick_test')
+
+
+
+3. Add your test database details in settings.py
+
+::
+ DATABASES = {
+ 'default':{
+ 'ENGINE':''},
+ 'test':{
+ 'ENGINE': '',
+ 'NAME': 'test_database',
+ }
+ }
+
+
+4. And finally replace the default Django test runner with this one. Again in settings.py:
+
+::
+
+ TEST_RUNNER = 'quick_test.NoseTestSuiteRunner'
+
+
+=========
+ Usage
+=========
+
+django-quick-test assumes that you have created your test database manualy and
+you have loaded the required test data(fixtures)
+
+
+
+Commands you have to run before using the command
+
+::
+ python manage.py syncdb --database=test
+ python manage.py migrate --database=test
+
+
+and finaly run your tests with
+
+::
+ python manage.py quick_test
+
+
+==================
+ Additional notes
+==================
+
+
+If you are using the default Django TestCase class
+you have to ovewrite the ``_pre_setup`` method which is executed
+automatically when you call the class. If you don't overwrite it
+the ``quick_test`` command will still work, but your test data
+will be lost. Even if you don't have any fixtures in the database
+overwriting this method will give you additional speed boost.
+
+::
+
+ from django.test import TestCase
+
+ class SimpleTest(TestCase)
+
+ def _pre_setup(self):
+ # this method flushes the database and installs
+ # the fixtures defined in the fixtures=[] list
+ # we are doing everything manually, so we don't
+ # really need it
+
+ # these are the results I get with 1 test before
+ and after ovewriting the method
+ # Before -> Ran 1 test in 2.336s
+ # After -> Ran 1 test in 0.004s
+ pass
+
+ def test_basic_addition(self):
+ self.assertEqual(1 + 1, 2)
+
+
+
+===============
+ Requirements
+===============
+
+
+Django 1.2+
+
+nose
+
View
0 ...ter_tests/management/commands/__init__.py → ...lib.linux-i686-2.7/quick_test/__init__.py 100755 → 100644
File renamed without changes.
View
0 django_better_tests/management/__init__.py → ...686-2.7/quick_test/management/__init__.py 100755 → 100644
File renamed without changes.
View
0 django_better_tests/__init__.py → ...uick_test/management/commands/__init__.py 100755 → 100644
File renamed without changes.
View
3 ...r_tests/management/commands/quick_test.py → ...ck_test/management/commands/quick_test.py 100755 → 100644
@@ -15,14 +15,13 @@ class Command(BaseCommand):
requires_model_validation = False
def handle(self, *test_labels, **options):
- from django.conf import settings
verbosity = int(options.get('verbosity', 1))
interactive = options.get('interactive', True)
failfast = options.get('failfast', False)
- test_module = __import__('django_better_tests.testrunner', {}, {}, 'NoseTestSuiteRunner')
+ test_module = __import__('quick_test.testrunner', {}, {}, 'NoseTestSuiteRunner')
TestRunner = getattr(test_module, 'NoseTestSuiteRunner')
if hasattr(TestRunner, 'func_name'):
View
0 django_better_tests/plugin.py → ...d/lib.linux-i686-2.7/quick_test/plugin.py
File renamed without changes.
View
99 build/lib.linux-i686-2.7/quick_test/testrunner.py
@@ -0,0 +1,99 @@
+import os
+import sys
+from django.conf import settings
+from django.core.management.base import BaseCommand
+from django.test.simple import DjangoTestSuiteRunner
+from django.db import connection
+import nose.core
+from plugin import ResultPlugin
+
+try:
+ any
+except NameError:
+ def any(iterable):
+ for element in iterable:
+ if element:
+ return True
+ return False
+
+# This is a table of Django's "manage.py test" options which
+# correspond to nosetests options with a different name:
+OPTION_TRANSLATION = {'--failfast': '-x'}
+
+
+class NoseTestSuiteRunner(DjangoTestSuiteRunner):
+
+ def run_suite(self, nose_argv):
+ result_plugin = ResultPlugin()
+ nose.core.TestProgram(argv=nose_argv, exit=False,
+ addplugins=[result_plugin])
+ return result_plugin.result
+
+ def run_tests(self, test_labels, extra_tests=None):
+ """
+ Run the unit tests for all the test names in the provided list.
+
+ Test names specified may be file or module names, and may optionally
+ indicate the test case to run by separating the module or file name
+ from the test case name with a colon. Filenames may be relative or
+ absolute. Examples:
+
+ runner.run_tests('test.module')
+ runner.run_tests('another.test:TestCase.test_method')
+ runner.run_tests('a.test:TestCase')
+ runner.run_tests('/path/to/test/file.py:test_function')
+
+ Returns the number of tests that failed.
+ """
+
+ settings.DEBUG = False
+
+ self.setup_test_environment()
+
+ try:
+ settings.DATABASES['default']['SUPPORTS_TRANSACTIONS'] = connection.creation._rollback_works()
+ settings.DATABASES['test']['SUPPORTS_TRANSACTIONS'] = connection.creation._rollback_works()
+ except:
+ # the database engine doesn't support transactions
+ pass
+
+ nose_argv = ['nosetests', '--verbosity', str(self.verbosity)]
+
+ if hasattr(settings, 'NOSE_ARGS'):
+ nose_argv.extend(settings.NOSE_ARGS)
+
+ # Skip over 'manage.py test' and any arguments handled by django.
+ django_opts = ['--noinput']
+ for opt in BaseCommand.option_list:
+ django_opts.extend(opt._long_opts)
+ django_opts.extend(opt._short_opts)
+
+ nose_argv.extend(OPTION_TRANSLATION.get(opt, opt)
+ for opt in sys.argv[2:]
+ if not any(opt.startswith(d) for d in django_opts))
+
+ if self.verbosity >= 1:
+ print ' '.join(nose_argv)
+
+
+ result = self.run_suite(nose_argv)
+
+ self.teardown_test_environment()
+ # suite_result expects the suite as the first argument. Fake it.
+ return self.suite_result({}, result)
+
+
+def _get_options():
+ """Return all nose options that don't conflict with django options."""
+ cfg_files = nose.core.all_config_files()
+ manager = nose.core.DefaultPluginManager()
+ config = nose.core.Config(env=os.environ, files=cfg_files, plugins=manager)
+ options = config.getParser().option_list
+ django_opts = [opt.dest for opt in BaseCommand.option_list] + ['version']
+ return tuple(o for o in options if o.dest not in django_opts and
+ o.action != 'help')
+
+
+# Replace the builtin command options with the merged django/nose options.
+NoseTestSuiteRunner.options = _get_options()
+NoseTestSuiteRunner.__test__ = False
View
BIN dist/django_quick_test-0.3.0-py2.7.egg
Binary file not shown.
View
18 django_better_tests/management/commands/create_test_db.py
@@ -1,18 +0,0 @@
-from django.core.management.base import BaseCommand
-from optparse import make_option
-import sys
-from django.db import connection
-from django.conf import settings
-from django.core.management import call_command
-
-class Command(BaseCommand):
- help = 'Creates the test db'
-
- def handle(self, *args, **options):
- connection.creation.create_test_db(verbosity = 1, autoclobber=False)
- call_command('migrate', database='test', app=None,
- target=None, skip=False, merge=False, backwards=False, fake=False, db_dry_run=False, show_list=False)
-
- connection.close()
-
-
View
25 django_better_tests/management/commands/destroy_test_db.py
@@ -1,25 +0,0 @@
-from django.core.management.base import BaseCommand
-from django.db import connections, connection
-from django.conf import settings
-import time
-
-
-TEST_DATABASE_NAME = settings.DATABASES['test']['NAME']
-
-class Command(BaseCommand):
- help = 'Destroys the test db'
-
- def handle(self, *args, **options):
-
- connection.close()
- if settings.DATABASES['default'] != "sqlite3":
-
- cursor = connections['default'].cursor() #connect to the real database to avoid 'cannot drop the currently open database'
- try:
- cursor.execute('commit')
- except AttributeError:
- pass
- else:
- time.sleep(2) # To avoid "database is being accessed by other users" errors.
- cursor.execute("DROP DATABASE %s" % TEST_DATABASE_NAME)
-
View
98 django_better_tests/testrunner.py
@@ -1,98 +0,0 @@
-import os
-import sys
-from django.conf import settings
-from django.core.management.base import BaseCommand
-from django.test.simple import DjangoTestSuiteRunner
-from django.db import connection
-import nose.core
-
-from tests.plugin import ResultPlugin
-
-try:
- any
-except NameError:
- def any(iterable):
- for element in iterable:
- if element:
- return True
- return False
-
-# This is a table of Django's "manage.py test" options which
-# correspond to nosetests options with a different name:
-OPTION_TRANSLATION = {'--failfast': '-x'}
-
-
-class NoseTestSuiteRunner(DjangoTestSuiteRunner):
-
- def run_suite(self, nose_argv):
- result_plugin = ResultPlugin()
- nose.core.TestProgram(argv=nose_argv, exit=False,
- addplugins=[result_plugin])
- return result_plugin.result
-
- def run_tests(self, test_labels, extra_tests=None):
- """
- Run the unit tests for all the test names in the provided list.
-
- Test names specified may be file or module names, and may optionally
- indicate the test case to run by separating the module or file name
- from the test case name with a colon. Filenames may be relative or
- absolute. Examples:
-
- runner.run_tests('test.module')
- runner.run_tests('another.test:TestCase.test_method')
- runner.run_tests('a.test:TestCase')
- runner.run_tests('/path/to/test/file.py:test_function')
-
- Returns the number of tests that failed.
- """
-
- settings.DEBUG = False
-
- self.setup_test_environment()
-
-
- settings.DATABASES['default']['SUPPORTS_TRANSACTIONS'] = connection.creation._rollback_works()
- settings.DATABASES['test']['SUPPORTS_TRANSACTIONS'] = connection.creation._rollback_works()
-
-
- nose_argv = ['nosetests', '--verbosity', str(self.verbosity)]
-
- if hasattr(settings, 'NOSE_ARGS'):
- nose_argv.extend(settings.NOSE_ARGS)
-
- # Skip over 'manage.py test' and any arguments handled by django.
- django_opts = ['--noinput']
- for opt in BaseCommand.option_list:
- django_opts.extend(opt._long_opts)
- django_opts.extend(opt._short_opts)
-
- nose_argv.extend(OPTION_TRANSLATION.get(opt, opt)
- for opt in sys.argv[2:]
- if not any(opt.startswith(d) for d in django_opts))
-
- if self.verbosity >= 1:
- print ' '.join(nose_argv)
-
-
- result = self.run_suite(nose_argv)
-
- self.teardown_test_environment()
- # suite_result expects the suite as the first argument. Fake it.
- return self.suite_result({}, result)
-
-
-def _get_options():
- """Return all nose options that don't conflict with django options."""
- cfg_files = nose.core.all_config_files()
- manager = nose.core.DefaultPluginManager()
- config = nose.core.Config(env=os.environ, files=cfg_files, plugins=manager)
- options = config.getParser().option_list
- django_opts = [opt.dest for opt in BaseCommand.option_list] + ['version']
- return tuple(o for o in options if o.dest not in django_opts and
- o.action != 'help')
-
-
-# Replace the builtin command options with the merged django/nose options.
-NoseTestSuiteRunner.options = _get_options()
-NoseTestSuiteRunner.__test__ = False
View
129 django_quick_test.egg-info/PKG-INFO
@@ -0,0 +1,129 @@
+Metadata-Version: 1.0
+Name: django-quick-test
+Version: 0.3.0
+Summary: Django test runner that separates test database creation and test running
+Home-page: http://github.com/martinrusev/django-quick-test
+Author: Martin Rusev
+Author-email: martinrusev@live.com
+License: BSD
+Description: =================
+ django-quick-test
+ =================
+
+ Django quick test is a custom nose based test runner that
+ separates testing and test related database manipulations.
+
+
+ Usualy running this command instead of the default ``manage.py test``
+ will give you 10-15 times speed boost. So you will be able to run
+ your test suite in seconds instead of minutes.
+
+ ===============
+ Installation
+ ===============
+
+
+ 1. Download the tarball and run ``python setup.py install``
+
+ 2. Add ``django_quick_test`` to your INSTALLED_APPS list in settings.py
+
+
+ ::
+
+ INSTALLED_APPS = ('django_quick_test')
+
+
+
+ 3. Add your test database details in settings.py
+
+ ::
+ DATABASES = {
+ 'default':{
+ 'ENGINE':''},
+ 'test':{
+ 'ENGINE': '',
+ 'NAME': 'test_database',
+ }
+ }
+
+
+ 4. And finally replace the default Django test runner with this one. Again in settings.py:
+
+ ::
+
+ TEST_RUNNER = 'django_quick_test.NoseTestSuiteRunner'
+
+
+ =========
+ Usage
+ =========
+
+ django-quick-test assumes that you have created your test database manualy and
+ you have loaded the required test data(fixtures)
+
+
+
+ Commands you have to run before using the command
+
+ ::
+ python manage.py syncdb --database=test
+ python manage.py migrate --database=test
+
+
+ and finaly run your tests with
+
+ ::
+ python manage.py quick_test
+
+
+ ==================
+ Additional notes
+ ==================
+
+
+ If you are using the default Django TestCase class
+ you have to ovewrite the ``_pre_setup`` method which is executed
+ automatically when you call the class. If you don't overwrite it
+ the ``quick_test`` command will still work, but your test data
+ will be lost. Even if you don't have any fixtures in the database
+ overwriting this method will give you additional speed boost.
+
+ ::
+
+ from django.test import TestCase
+
+ class SimpleTest(TestCase)
+
+ def _pre_setup(self):
+ # this method flushes the database and installs
+ # the fixtures defined in the fixtures=[] list
+ # we are doing everything manually, so we don't
+ # really need it
+
+ # these are the results I get with 1 test before
+ and after ovewriting the method
+ # Before -> Ran 1 test in 2.336s
+ # After -> Ran 1 test in 0.004s
+ pass
+
+ def test_basic_addition(self):
+ self.assertEqual(1 + 1, 2)
+
+
+
+ ===============
+ Requirements
+ ===============
+
+
+ Django 1.2+
+
+ nose
+
+
+Keywords: django,tests,nose,
+Platform: UNKNOWN
+Classifier: Programming Language :: Python
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Classifier: Framework :: Django
+Classifier: Environment :: Web Environment
View
13 django_quick_test.egg-info/SOURCES.txt
@@ -0,0 +1,13 @@
+setup.py
+django_quick_test.egg-info/PKG-INFO
+django_quick_test.egg-info/SOURCES.txt
+django_quick_test.egg-info/dependency_links.txt
+django_quick_test.egg-info/not-zip-safe
+django_quick_test.egg-info/requires.txt
+django_quick_test.egg-info/top_level.txt
+quick_test/__init__.py
+quick_test/plugin.py
+quick_test/testrunner.py
+quick_test/management/__init__.py
+quick_test/management/commands/__init__.py
+quick_test/management/commands/quick_test.py
View
1 django_quick_test.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
View
1 django_quick_test.egg-info/not-zip-safe
@@ -0,0 +1 @@
+
View
2 django_quick_test.egg-info/requires.txt
@@ -0,0 +1,2 @@
+setuptools
+nose
View
1 django_quick_test.egg-info/top_level.txt
@@ -0,0 +1 @@
+quick_test
View
0 quick_test/__init__.py
No changes.
View
0 quick_test/management/__init__.py
No changes.
View
0 quick_test/management/commands/__init__.py
No changes.
View
41 quick_test/management/commands/quick_test.py
@@ -0,0 +1,41 @@
+from django.core.management.base import BaseCommand
+from optparse import make_option
+import sys
+
+class Command(BaseCommand):
+ option_list = BaseCommand.option_list + (
+ make_option('--noinput', action='store_false', dest='interactive', default=True,
+ help='Tells Django to NOT prompt the user for input of any kind.'),
+ make_option('--failfast', action='store_true', dest='failfast', default=False,
+ help='Tells Django to stop running the test suite after first failed test.')
+ )
+ help = 'Runs the test suite for the specified applications, or the entire site if no apps are specified.'
+ args = '[appname ...]'
+
+ requires_model_validation = False
+
+ def handle(self, *test_labels, **options):
+
+ verbosity = int(options.get('verbosity', 1))
+ interactive = options.get('interactive', True)
+ failfast = options.get('failfast', False)
+
+
+ test_module = __import__('quick_test.testrunner', {}, {}, 'NoseTestSuiteRunner')
+ TestRunner = getattr(test_module, 'NoseTestSuiteRunner')
+
+ 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.',
+ PendingDeprecationWarning
+ )
+ failures = TestRunner(test_labels, verbosity=verbosity, interactive=interactive)
+ else:
+ test_runner = TestRunner(verbosity=verbosity, interactive=interactive, failfast=failfast)
+ failures = test_runner.run_tests(test_labels)
+
+ if failures:
+ sys.exit(bool(failures))
View
14 quick_test/plugin.py
@@ -0,0 +1,14 @@
+class ResultPlugin(object):
+ """
+ Captures the TestResult object for later inspection.
+
+ nose doesn't return the full test result object from any of its runner
+ methods. Pass an instance of this plugin to the TestProgram and use
+ ``result`` after running the tests to get the TestResult object.
+ """
+
+ name = "result"
+ enabled = True
+
+ def finalize(self, result):
+ self.result = result
View
99 quick_test/testrunner.py
@@ -0,0 +1,99 @@
+import os
+import sys
+from django.conf import settings
+from django.core.management.base import BaseCommand
+from django.test.simple import DjangoTestSuiteRunner
+from django.db import connection
+import nose.core
+from plugin import ResultPlugin
+
+try:
+ any
+except NameError:
+ def any(iterable):
+ for element in iterable:
+ if element:
+ return True
+ return False
+
+# This is a table of Django's "manage.py test" options which
+# correspond to nosetests options with a different name:
+OPTION_TRANSLATION = {'--failfast': '-x'}
+
+
+class NoseTestSuiteRunner(DjangoTestSuiteRunner):
+
+ def run_suite(self, nose_argv):
+ result_plugin = ResultPlugin()
+ nose.core.TestProgram(argv=nose_argv, exit=False,
+ addplugins=[result_plugin])
+ return result_plugin.result
+
+ def run_tests(self, test_labels, extra_tests=None):
+ """
+ Run the unit tests for all the test names in the provided list.
+
+ Test names specified may be file or module names, and may optionally
+ indicate the test case to run by separating the module or file name
+ from the test case name with a colon. Filenames may be relative or
+ absolute. Examples:
+
+ runner.run_tests('test.module')
+ runner.run_tests('another.test:TestCase.test_method')
+ runner.run_tests('a.test:TestCase')
+ runner.run_tests('/path/to/test/file.py:test_function')
+
+ Returns the number of tests that failed.
+ """
+
+ settings.DEBUG = False
+
+ self.setup_test_environment()
+
+ try:
+ settings.DATABASES['default']['SUPPORTS_TRANSACTIONS'] = connection.creation._rollback_works()
+ settings.DATABASES['test']['SUPPORTS_TRANSACTIONS'] = connection.creation._rollback_works()
+ except:
+ # the database engine doesn't support transactions
+ pass
+
+ nose_argv = ['nosetests', '--verbosity', str(self.verbosity)]
+
+ if hasattr(settings, 'NOSE_ARGS'):
+ nose_argv.extend(settings.NOSE_ARGS)
+
+ # Skip over 'manage.py test' and any arguments handled by django.
+ django_opts = ['--noinput']
+ for opt in BaseCommand.option_list:
+ django_opts.extend(opt._long_opts)
+ django_opts.extend(opt._short_opts)
+
+ nose_argv.extend(OPTION_TRANSLATION.get(opt, opt)
+ for opt in sys.argv[2:]
+ if not any(opt.startswith(d) for d in django_opts))
+
+ if self.verbosity >= 1:
+ print ' '.join(nose_argv)
+
+
+ result = self.run_suite(nose_argv)
+
+ self.teardown_test_environment()
+ # suite_result expects the suite as the first argument. Fake it.
+ return self.suite_result({}, result)
+
+
+def _get_options():
+ """Return all nose options that don't conflict with django options."""
+ cfg_files = nose.core.all_config_files()
+ manager = nose.core.DefaultPluginManager()
+ config = nose.core.Config(env=os.environ, files=cfg_files, plugins=manager)
+ options = config.getParser().option_list
+ django_opts = [opt.dest for opt in BaseCommand.option_list] + ['version']
+ return tuple(o for o in options if o.dest not in django_opts and
+ o.action != 'help')
+
+
+# Replace the builtin command options with the merged django/nose options.
+NoseTestSuiteRunner.options = _get_options()
+NoseTestSuiteRunner.__test__ = False
View
9 setup.py
@@ -1,10 +1,10 @@
from setuptools import setup, find_packages
-version = '0.2.0'
+version = '0.3.0'
setup(
- name='django_better_tests',
- version='0.2.0',
+ name='django_quick_test',
+ version='0.3.0',
description="Django test runner that separates test database creation and test running",
long_description=open('README.rst').read(),
classifiers=[
@@ -16,11 +16,10 @@
keywords='django, tests, nose,',
author='Martin Rusev',
author_email='martinrusev@live.com',
- url='http://github.com/martinrusev/django-better-tests',
+ url='https://github.com/martinrusev/django-quick-test',
license='BSD',
packages=find_packages(),
zip_safe=False,
install_requires=['setuptools','nose',],
include_package_data=True,
- setup_requires=['setuptools_git'],
)

0 comments on commit 7379eb0

Please sign in to comment.
Something went wrong with that request. Please try again.