diff --git a/README.rst b/README.rst index de73cac..b697290 100644 --- a/README.rst +++ b/README.rst @@ -80,7 +80,7 @@ Requirements ------------ - Python (2.6, 2.7, 3.1, 3.3, 3.4, PyPy) -- Django (1.5, 1.6, 1.7, 1.8) +- Django (1.5, 1.6, 1.7, 1.8, 1.9) Installation @@ -228,6 +228,13 @@ Define the prefix in your django settings: :: JS_REVERSE_SCRIPT_PREFIX = '/myprefix/' +By default collectstatic_js_reverse writes its output (reverse.js) to your project's STATIC_ROOT. +You can change the output path: + +:: + + JS_REVERSE_OUTPUT_PATH = 'some_path' + License ------- diff --git a/django_js_reverse/js_reverse_settings.py b/django_js_reverse/js_reverse_settings.py index 976149f..3a40fd9 100755 --- a/django_js_reverse/js_reverse_settings.py +++ b/django_js_reverse/js_reverse_settings.py @@ -4,3 +4,4 @@ JS_EXCLUDE_NAMESPACES = [] JS_SCRIPT_PREFIX = None JS_GLOBAL_OBJECT_NAME = 'this' +JS_OUTPUT_PATH = None diff --git a/django_js_reverse/management/commands/collectstatic_js_reverse.py b/django_js_reverse/management/commands/collectstatic_js_reverse.py index 2139970..2dec234 100755 --- a/django_js_reverse/management/commands/collectstatic_js_reverse.py +++ b/django_js_reverse/management/commands/collectstatic_js_reverse.py @@ -10,16 +10,24 @@ from django.core.management.base import BaseCommand from django_js_reverse.core import generate_js +from django_js_reverse.js_reverse_settings import JS_OUTPUT_PATH class Command(BaseCommand): help = 'Creates a static urls-js file for django-js-reverse' - def handle(self, *args, **options): + def get_location(self): + output_path = getattr(settings, 'JS_REVERSE_OUTPUT_PATH', JS_OUTPUT_PATH) + if output_path: + return output_path + if not hasattr(settings, 'STATIC_ROOT') or not settings.STATIC_ROOT: - raise ImproperlyConfigured('The collectstatic_js_reverse command needs settings.STATIC_ROOT to be set.') + raise ImproperlyConfigured('The collectstatic_js_reverse command needs settings.JS_OUTPUT_PATH or settings.STATIC_ROOT to be set.') - location = os.path.join(settings.STATIC_ROOT, 'django_js_reverse', 'js') + return os.path.join(settings.STATIC_ROOT, 'django_js_reverse', 'js') + + def handle(self, *args, **options): + location = self.get_location() file = 'reverse.js' fs = FileSystemStorage(location=location) if fs.exists(file): diff --git a/tests/settings.py b/tests/settings.py index 9581837..d31f575 100644 --- a/tests/settings.py +++ b/tests/settings.py @@ -14,4 +14,10 @@ ) ALLOWED_HOSTS = ['testserver'] MIDDLEWARE_CLASSES = () -STATIC_ROOT = os.path.join(os.path.dirname(__file__), 'tmp') +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'APP_DIRS': True, + }, +] +STATIC_ROOT = os.path.join(os.path.dirname(__file__), 'tmp', 'static_root') diff --git a/tests/test_urls.py b/tests/test_urls.py index a3dc5dc..efe9c82 100644 --- a/tests/test_urls.py +++ b/tests/test_urls.py @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- import sys from copy import copy - -from django.conf.urls import include, patterns, url +from django.conf.urls import include, url +from django_js_reverse.views import urls_js if sys.version < '3': import codecs + def u(x): return codecs.unicode_escape_decode(x)[0] else: @@ -17,53 +18,58 @@ def u(x): def dummy_view(*args, **kwargs): pass -basic_patterns = patterns('', - url(r'^jsreverse/$', 'django_js_reverse.views.urls_js', name='js_reverse'), - # test urls - url(r'^test_no_url_args/$', dummy_view, - name='test_no_url_args'), - url(r'^test_one_url_args/(?P[-\w]+)/$', dummy_view, - name='test_one_url_args'), - url(r'^test_two_url_args/(?P[-\w]+)-(?P[-\w]+)/$', dummy_view, - name='test_two_url_args'), - url(r'^test_optional_url_arg/(?:1_(?P[-\w]+)-)?2_(?P[-\w]+)/$', dummy_view, - name='test_optional_url_arg'), - url(r'^test_unicode_url_name/$', dummy_view, - name=u('test_unicode_url_name')), - url(r'^test_duplicate_name/(?P[-\w]+)/$', dummy_view, - name='test_duplicate_name'), - url(r'^test_duplicate_name/(?P[-\w]+)-(?P[-\w]+)/$', dummy_view, - name='test_duplicate_name'), - url(r'^test_duplicate_argcount/(?P[-\w]+)?-(?P[-\w]+)?/$', dummy_view, - name='test_duplicate_argcount'), - ) +basic_patterns = [ + url(r'^jsreverse/$', urls_js, name='js_reverse'), + + # test urls + url(r'^test_no_url_args/$', dummy_view, + name='test_no_url_args'), + url(r'^test_one_url_args/(?P[-\w]+)/$', dummy_view, + name='test_one_url_args'), + url(r'^test_two_url_args/(?P[-\w]+)-(?P[-\w]+)/$', dummy_view, + name='test_two_url_args'), + url(r'^test_optional_url_arg/(?:1_(?P[-\w]+)-)?2_(?P[-\w]+)/$', dummy_view, + name='test_optional_url_arg'), + url(r'^test_unicode_url_name/$', dummy_view, + name=u('test_unicode_url_name')), + url(r'^test_duplicate_name/(?P[-\w]+)/$', dummy_view, + name='test_duplicate_name'), + url(r'^test_duplicate_name/(?P[-\w]+)-(?P[-\w]+)/$', dummy_view, + name='test_duplicate_name'), + url(r'^test_duplicate_argcount/(?P[-\w]+)?-(?P[-\w]+)?/$', dummy_view, + name='test_duplicate_argcount'), +] urlpatterns = copy(basic_patterns) # test exclude namespaces urls -urlexclude = patterns('', - url(r'^test_exclude_namespace/$', dummy_view, - name='test_exclude_namespace_url1')) - +urlexclude = [ + url(r'^test_exclude_namespace/$', dummy_view, + name='test_exclude_namespace_url1') +] # test namespace -pattern_ns_1 = patterns('', - url(r'', include(basic_patterns))) +pattern_ns_1 = [ + url(r'', include(basic_patterns)) +] -pattern_ns_2 = patterns('', - url(r'', include(basic_patterns))) +pattern_ns_2 = [ + url(r'', include(basic_patterns)) +] -pattern_ns_arg = patterns('', - url(r'', include(basic_patterns))) +pattern_ns_arg = [ + url(r'', include(basic_patterns)) +] -pattern_nested_ns = patterns('', - url(r'^ns1/', include(pattern_ns_1, - namespace='ns1'))) +pattern_nested_ns = [ + url(r'^ns1/', include(pattern_ns_1, namespace='ns1')) +] -urlpatterns += patterns('', - url(r'^ns1/', include(pattern_ns_1, namespace='ns1')), - url(r'^ns2/', include(pattern_ns_2, namespace='ns2')), - url(r'^ns_ex/', include(urlexclude, namespace='exclude_namespace')), - url(r'^ns(?P[^/]*)/', include(pattern_ns_arg, namespace='ns_arg')), - url(r'^nestedns/', include(pattern_nested_ns, namespace='nestedns'))) +urlpatterns += [ + url(r'^ns1/', include(pattern_ns_1, namespace='ns1')), + url(r'^ns2/', include(pattern_ns_2, namespace='ns2')), + url(r'^ns_ex/', include(urlexclude, namespace='exclude_namespace')), + url(r'^ns(?P[^/]*)/', include(pattern_ns_arg, namespace='ns_arg')), + url(r'^nestedns/', include(pattern_nested_ns, namespace='nestedns')) +] diff --git a/tests/tmp/DONOTDELETE b/tests/tmp/DONOTDELETE deleted file mode 100644 index e69de29..0000000 diff --git a/tests/tmp/some_path/.gitignore b/tests/tmp/some_path/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/tests/tmp/some_path/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/tests/tmp/static_root/.gitignore b/tests/tmp/static_root/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/tests/tmp/static_root/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/tests/unit_tests.py b/tests/unit_tests.py index dd40769..7ba7f20 100755 --- a/tests/unit_tests.py +++ b/tests/unit_tests.py @@ -17,7 +17,7 @@ from django.test import TestCase from django.test.client import Client from django.test.utils import override_settings -from django.utils import unittest +import unittest from django.utils.encoding import smart_str from selenium.webdriver.phantomjs.webdriver import WebDriver @@ -183,6 +183,31 @@ def test_reverse_js_file_save(self): with self.assertRaises(ImproperlyConfigured): call_command('collectstatic_js_reverse') + def test_reverse_js_file_save_with_output_path_option(self): + js_output_path = os.path.join(os.path.dirname(__file__), 'tmp', 'some_path') + with override_settings(JS_REVERSE_OUTPUT_PATH=js_output_path): + call_command('collectstatic_js_reverse') + + f = open(os.path.join(js_output_path, 'reverse.js')) + content1 = f.read() + if hasattr(content1, 'decode'): + content1 = content1.decode() + + r2 = self.client.get('/jsreverse/') + content2 = r2.content + if hasattr(content2, 'decode'): + content2 = content2.decode() + + self.assertEqual(len(content1), len(content2), 'Static file don\'t match http response content_1') + self.assertEqual(content1, content2, 'Static file don\'t match http response content_2') + + # should not raise ImproperlyConfigured exception if STATIC_ROOT is not set + with override_settings(STATIC_ROOT=None): + try: + call_command('collectstatic_js_reverse') + except ImproperlyConfigured: + self.fail('should not raise ImproperlyConfigured exception if STATIC_ROOT is not set and JS_REVERSE_OUTPUT_PATH is set') + def test_script_prefix(self): script_prefix = '/test/foo/bar/' with override_settings(JS_REVERSE_SCRIPT_PREFIX=script_prefix): diff --git a/tox.ini b/tox.ini index addaaa6..781eaaf 100644 --- a/tox.ini +++ b/tox.ini @@ -1,10 +1,9 @@ [tox] envlist = py26-django16, py26-django15, - py27-django18, py27-django17, py27-django16, py27-django15, - py32-django18, py32-django17, py32-django16, py32-django15, - py33-django18, py33-django17, py33-django16, py33-django15, - py34-django18, py34-django17, py34-django16, py34-django15, + py27-django19, py27-django18, py27-django17, py27-django16, py27-django15, + py33-django19, py33-django18, py33-django17, py33-django16, py33-django15, + py34-django19, py34-django18, py34-django17, py34-django16, py34-django15, ;pypy25-django18, pypy25-django17, pypy25-django16, pypy25-django15, ;pypy3-24-django18, pypy3-24-django17, pypy3-24-django16, pypy3-24-django15 @@ -15,6 +14,12 @@ commands = coverage run -p tests/unit_tests.py deps=coverage==3.7.1 selenium==2.45.0 +[testenv:py27-django19] +basepython = python2.7 +deps = + Django>=1.9,<1.10 + {[testenv]deps} + [testenv:py27-django18] basepython = python2.7 deps = @@ -51,28 +56,10 @@ deps = Django>=1.5,<1.6 {[testenv]deps} -[testenv:py32-django18] -basepython = python3.2 -deps = - Django>=1.8,<1.9 - {[testenv]deps} - -[testenv:py32-django17] -basepython = python3.2 -deps = - Django>=1.7,<1.8 - {[testenv]deps} - -[testenv:py32-django16] -basepython = python3.2 -deps = - Django>=1.6,<1.7 - {[testenv]deps} - -[testenv:py32-django15] -basepython = python3.2 +[testenv:py33-django19] +basepython = python3.3 deps = - Django>=1.5,<1.6 + Django>=1.9,<1.10 {[testenv]deps} [testenv:py33-django18] @@ -99,6 +86,12 @@ deps = Django>=1.5,<1.6 {[testenv]deps} +[testenv:py34-django19] +basepython = python3.4 +deps = + Django>=1.9,<1.10 + {[testenv]deps} + [testenv:py34-django18] basepython = python3.4 deps = @@ -123,6 +116,12 @@ deps = Django>=1.5,<1.6 {[testenv]deps} +[testenv:pypy25-django19] +basepython = pypy +deps = + Django>=1.9,<1.10 + {[testenv]deps} + [testenv:pypy25-django18] basepython = pypy deps = @@ -147,6 +146,12 @@ deps = Django>=1.5,<1.6 {[testenv]deps} +[testenv:pypy3-24-django19] +basepython = pypy3 +deps = + Django>=1.9,<1.10 + {[testenv]deps} + [testenv:pypy3-24-django18] basepython = pypy3 deps =