From f0305d2b937eb9c771228cec3e95301103f4c6a4 Mon Sep 17 00:00:00 2001 From: Thomas Grainger Date: Mon, 21 Sep 2015 11:26:34 +0100 Subject: [PATCH] add django 1.8 tests --- .travis.yml | 43 ++++---- django_babel/extract.py | 2 +- django_babel/management/commands/babel.py | 26 ++--- docs/conf.py | 3 +- setup.cfg | 16 --- setup.py | 51 ++-------- tasks.py | 13 --- tests/__init__.py | 0 tests/test_extract.py | 70 +++++++++---- tox.ini | 115 +++++----------------- 10 files changed, 126 insertions(+), 213 deletions(-) delete mode 100644 tasks.py delete mode 100644 tests/__init__.py diff --git a/.travis.yml b/.travis.yml index ff83c7a..53dd3ec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,22 +1,29 @@ language: python -python: - - "2.6" - - "2.7" - - "3.3" - - "3.4" - - "pypy" +python: 3.4 env: - - DJANGO_VERSION=master - - DJANGO_VERSION=1.7.x - - DJANGO_VERSION=1.6.x - - DJANGO_VERSION=1.5.x + - TOX_ENV=py27-django15 + - TOX_ENV=py27-django16 + - TOX_ENV=py27-django17 + - TOX_ENV=py27-django18 + - TOX_ENV=py27-djangomaster + - TOX_ENV=py33-django15 + - TOX_ENV=py33-django16 + - TOX_ENV=py33-django17 + - TOX_ENV=py33-django18 + - TOX_ENV=py33-djangomaster + - TOX_ENV=py34-django15 + - TOX_ENV=py34-django16 + - TOX_ENV=py34-django17 + - TOX_ENV=py34-django18 + - TOX_ENV=py34-djangomaster + - TOX_ENV=py26-django15 + - TOX_ENV=py26-django16 + - TOX_ENV=lint + - TOX_ENV=docs install: - - pip install tox +- pip install tox script: - - tox -e "$TRAVIS_PYTHON_VERSION-$DJANGO_VERSION" -matrix: - exclude: - - python: "2.6" - env: DJANGO_VERSION=master - - python: "2.6" - env: DJANGO_VERSION=1.7.x +- tox -e $TOX_ENV +cache: + directories: + - $HOME/.cache/pip diff --git a/django_babel/extract.py b/django_babel/extract.py index a2bb571..9dc57f4 100644 --- a/django_babel/extract.py +++ b/django_babel/extract.py @@ -2,7 +2,7 @@ from django.template import Lexer, TOKEN_TEXT, TOKEN_VAR, TOKEN_BLOCK from django.utils.translation.trans_real import ( inline_re, block_re, endblock_re, plural_re, constant_re) -from django.utils.encoding import smart_unicode +from django.utils.encoding import smart_text as smart_unicode def extract_django(fileobj, keywords, comment_tags, options): diff --git a/django_babel/management/commands/babel.py b/django_babel/management/commands/babel.py index 35e7d35..a2402b7 100644 --- a/django_babel/management/commands/babel.py +++ b/django_babel/management/commands/babel.py @@ -1,4 +1,4 @@ -#-*- coding: utf-8 -*- +# -*- coding: utf-8 -*- import os from distutils.dist import Distribution from optparse import make_option @@ -14,16 +14,20 @@ class Command(LabelCommand): option_list = LabelCommand.option_list + ( make_option( - '--locale', '-l', - default=None, dest='locale', action='append', - help='Creates or updates the message files for the given locale(s)' - ' (e.g pt_BR). Can be used multiple times.'), - make_option('--domain', '-d', - default='django', dest='domain', - help='The domain of the message files (default: "django").'), - make_option('--mapping-file', '-F', - default=None, dest='mapping_file', - help='Mapping file') + '--locale', '-l', default=None, dest='locale', action='append', + help=( + 'Creates or updates the message files for the given locale(s)' + ' (e.g pt_BR). Can be used multiple times.' + ), + ), + make_option( + '--domain', '-d', default='django', dest='domain', + help='The domain of the message files (default: "django").', + ), + make_option( + '--mapping-file', '-F', default=None, dest='mapping_file', + help='Mapping file', + ) ) def handle_label(self, command, **options): diff --git a/docs/conf.py b/docs/conf.py index 51755fb..1e3bec4 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -101,7 +101,7 @@ pygments_style = 'sphinx' # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -html_theme = 'default' +html_theme = 'alabaster' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the @@ -130,7 +130,6 @@ html_theme = 'default' # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied diff --git a/setup.cfg b/setup.cfg index bdd4dca..5e40900 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,18 +1,2 @@ -[pytest] -addopts=-vs --pep8 --flakes -timeout=5 -norecursedirs=.tox -pep8ignore = - *.py E128 - docs/conf.py ALL - tests/*.py ALL -flakes-ignore = - docs/conf.py ALL - tests/*.py ALL - -[flake8] -ignore = E128 -exclude = .tox,.git,docs/conf.py,tests/*.py - [wheel] universal = 1 diff --git a/setup.py b/setup.py index 85483af..5c7ec54 100755 --- a/setup.py +++ b/setup.py @@ -4,7 +4,6 @@ import os import sys import codecs from setuptools import setup, find_packages -from setuptools.command.test import test as TestCommand def read(*parts): @@ -13,43 +12,12 @@ def read(*parts): return fp.read() -test_requires = [ - 'coverage', - 'pytest', - 'pytest-cov>=1.4', - 'pytest-flakes', - 'pytest-pep8', - 'python-coveralls', -] - - install_requires = [ - 'Django>=1.4,<1.7', + 'Django>=1.4,<1.9', 'Babel>=1.3', ] -dev_requires = [ - 'flake8>=2.0', - 'invoke', - 'twine' -] - - -class PyTest(TestCommand): - - def finalize_options(self): - TestCommand.finalize_options(self) - self.test_args = [] - self.test_suite = True - - def run_tests(self): - # import here, cause outside the eggs aren't loaded - import pytest - errno = pytest.main(self.test_args) - sys.exit(errno) - - setup( name='django-babel', description='Utilities for using Babel in Django', @@ -58,17 +26,14 @@ setup( license='BSD', author='Christopher Grebs', author_email='cg@webshox.org', - url='http://github.com/graingert/django-babel/', + maintainer='Thomas Grainger', + maintainer_email='django-babel@graingert.co.uk', + url='https://github.com/graingert/django-babel/', packages=find_packages(exclude=('tests',)), - tests_require=test_requires, - install_requires=install_requires, - cmdclass={'test': PyTest}, - extras_require={ - 'docs': ['sphinx'], - 'tox': ['tox'], - 'tests': test_requires, - 'dev': dev_requires, - }, + install_requires=[ + 'Django>=1.4,<1.8', + 'Babel>=1.3', + ], classifiers=[ 'Development Status :: 4 - Beta', 'Environment :: Web Environment', diff --git a/tasks.py b/tasks.py deleted file mode 100644 index 8a2138b..0000000 --- a/tasks.py +++ /dev/null @@ -1,13 +0,0 @@ -import invoke - - -@invoke.task -def release(version): - """`version`` should be a string like '0.4' or '1.0'.""" - invoke.run('git tag -s {0}'.format(version)) - invoke.run('git push --tags') - - invoke.run('python setup.py sdist') - invoke.run('python setup.py bdist_wheel') - - invoke.run('twine upload -s dist/django*babel{0}* '.format(version)) diff --git a/tests/__init__.py b/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/test_extract.py b/tests/test_extract.py index 833377d..a1245bb 100644 --- a/tests/test_extract.py +++ b/tests/test_extract.py @@ -1,7 +1,8 @@ -#-*- coding: utf-8 -*- +# -*- coding: utf-8 -*- import unittest import pytest + from babel.messages import extract from babel._compat import BytesIO @@ -35,7 +36,11 @@ class ExtractDjangoTestCase(unittest.TestCase): self.assertEqual([(1, None, u'%(anton)s', [])], messages) def test_extract_filter_with_filter(self): - buf = BytesIO(b'{% blocktrans with berta=anton|lower %}{{ berta }}{% endblocktrans %}') + test_tmpl = ( + b'{% blocktrans with berta=anton|lower %}' + b'{{ berta }}{% endblocktrans %}' + ) + buf = BytesIO(test_tmpl) messages = list(extract_django(buf, default_keys, [], {})) self.assertEqual([(1, None, u'%(berta)s', [])], messages) @@ -45,42 +50,69 @@ class ExtractDjangoTestCase(unittest.TestCase): self.assertEqual([(1, None, u'xxx%(anton)sxxx', [])], messages) def test_extract_unicode(self): - buf = BytesIO(b'{% trans "@ſðæ314“ſſ¶ÐĐÞ→SÆ^ĸŁ" %}') + buf = BytesIO(u'{% trans "@ſðæ314“ſſ¶ÐĐÞ→SÆ^ĸŁ" %}'.encode('utf8')) messages = list(extract_django(buf, default_keys, [], {})) self.assertEqual([(1, None, u'@ſðæ314“ſſ¶ÐĐÞ→SÆ^ĸŁ', [])], messages) def test_extract_unicode_blocktrans(self): - buf = BytesIO(b'{% blocktrans %}@ſðæ314“ſſ¶ÐĐÞ→SÆ^ĸŁ{% endblocktrans %}') + test_tmpl = u'{% blocktrans %}@ſðæ314“ſſ¶ÐĐÞ→SÆ^ĸŁ{% endblocktrans %}' + buf = BytesIO(test_tmpl.encode('utf8')) messages = list(extract_django(buf, default_keys, [], {})) self.assertEqual([(1, None, u'@ſðæ314“ſſ¶ÐĐÞ→SÆ^ĸŁ', [])], messages) # TODO: Yet expected to not extract the comments. def test_extract_ignored_comment(self): - buf = BytesIO(b'{# ignored comment #1 #}{% trans "Translatable literal #9a" %}') + buf = BytesIO( + b'{# ignored comment #1 #}{% trans "Translatable literal #9a" %}', + ) messages = list(extract_django(buf, default_keys, [], {})) - self.assertEqual([(1, None, u'Translatable literal #9a', [])], messages) + self.assertEqual( + [(1, None, u'Translatable literal #9a', [])], messages + ) def test_extract_ignored_comment2(self): - buf = BytesIO(b'{# Translators: ignored i18n comment #1 #}{% trans "Translatable literal #9a" %}') + test_tmpl = ( + b'{# Translators: ignored i18n comment #1 #}' + b'{% trans "Translatable literal #9a" %}' + ) + buf = BytesIO(test_tmpl) messages = list(extract_django(buf, default_keys, [], {})) - self.assertEqual([(1, None, u'Translatable literal #9a', [])], messages) + self.assertEqual( + [(1, None, u'Translatable literal #9a', [])], messages + ) def test_extract_valid_comment(self): - buf = BytesIO(b'{# ignored comment #6 #}{% trans "Translatable literal #9h" %}{# Translators: valid i18n comment #7 #}') + test_tmpl = ( + b'{# ignored comment #6 #}' + b'{% trans "Translatable literal #9h" %}' + b'{# Translators: valid i18n comment #7 #}' + ) + buf = BytesIO(test_tmpl) messages = list(extract_django(buf, default_keys, [], {})) - self.assertEqual([(1, None, u'Translatable literal #9h', [])], messages) + self.assertEqual( + [(1, None, u'Translatable literal #9h', [])], messages + ) def test_extract_singular_form(self): - buf = BytesIO(b'{% blocktrans count counter=number %}singular{% plural %}{{ counter }} plural{% endblocktrans %}') + test_tmpl = ( + b'{% blocktrans count counter=number %}' + b'singular{% plural %}{{ counter }} plural' + b'{% endblocktrans %}' + ) + buf = BytesIO(test_tmpl) messages = list(extract_django(buf, default_keys, [], {})) - self.assertEqual([(1, 'ngettext', (u'singular', u'%(counter)s plural'), [])], messages) + self.assertEqual( + [(1, 'ngettext', (u'singular', u'%(counter)s plural'), [])], + messages + ) def test_trans_blocks_must_not_include_other_block_tags(self): buf = BytesIO(b'{% blocktrans %}{% other_tag %}{% endblocktrans %}') gen = extract_django(buf, default_keys, [], {}) - pytest.raises(SyntaxError, gen.next) + with pytest.raises(SyntaxError): + next(gen) - def test_extract_var(self): + def test_extract_var_other(self): buf = BytesIO(b'{{ book }}') messages = list(extract_django(buf, default_keys, [], {})) self.assertEqual([], messages) @@ -100,7 +132,7 @@ class ExtractDjangoTestCase(unittest.TestCase): messages = list(extract_django(buf, default_keys, [], {})) self.assertEqual([(1, None, u"'constant'", [])], messages) - def test_extract_constant_single_quotes(self): + def test_extract_constant_double_quotes(self): buf = BytesIO(b'{{ _("constant") }}') messages = list(extract_django(buf, default_keys, [], {})) self.assertEqual([(1, None, u'"constant"', [])], messages) @@ -111,8 +143,12 @@ class ExtractDjangoTestCase(unittest.TestCase): self.assertEqual([(1, None, u'"constant"', [])], messages) def test_extract_constant_in_block(self): - buf = BytesIO(b'{% blocktrans foo=_("constant") %}{{ foo }}{% endblocktrans %}') + test_tmpl = ( + b'{% blocktrans foo=_("constant") %}{{ foo }}{% endblocktrans %}' + ) + buf = BytesIO(test_tmpl) messages = list(extract_django(buf, default_keys, [], {})) self.assertEqual( [(1, None, u'"constant"', []), (1, None, u'%(foo)s', [])], - messages) + messages, + ) diff --git a/tox.ini b/tox.ini index 4b0eef8..4c34f2e 100644 --- a/tox.ini +++ b/tox.ini @@ -1,95 +1,26 @@ +[tox] +envlist = {py27,py33,py34}-django{15,16,17,18,master}, py26-django{15,16}, lint, docs + [testenv] -skipsdist = True -usedevelop = True +deps = + coverage + pytest + pytest-cov + python-coveralls + django15: Django>=1.5,<1.6 + django16: Django>=1.6,<1.7 + django17: Django>=1.7,<1.8 + django18: Django>=1.8,<1.9 + djangomaster: https://github.com/django/django/archive/master.tar.gz#egg=Django +commands = py.test {posargs} + +[testenv:docs] +deps = sphinx commands = - pip install -e {toxinidir} - pip install -e {toxinidir}[tests] + sphinx-build -W -b html -d {envtmpdir}/doctrees docs {envtmpdir}/_build/html + sphinx-build -W -b linkcheck docs {envtmpdir}/_build/html -deps15 = - https://github.com/django/django/archive/stable/1.5.x.zip#egg=django -deps16 = - https://github.com/django/django/archive/stable/1.6.x.zip#egg=django -deps17 = - https://github.com/django/django/archive/stable/1.7.x.zip#egg=django -master = - https://github.com/django/django/archive/stable/1.7.x.zip#egg=django - -[testenv:2.6-1.5.x] -basepython = python2.6 -deps = {[testenv]deps15} - -[testenv:2.6-1.6.x] -basepython = python2.6 -deps = {[testenv]deps16} - -[testenv:2.7-1.5.x] -basepython = python2.7 -deps = {[testenv]deps15} - -[testenv:2.7-1.6.x] -basepython = python2.7 -deps = {[testenv]deps16} - -[testenv:2.7-1.7.x] -basepython = python2.7 -deps = {[testenv]deps17} - -[testenv:2.7-master] -basepython = python2.7 -deps = {[testenv]master} - -[testenv:3.3-1.5.x] -basepython = python3.3 -deps = {[testenv]deps15} - -[testenv:3.3-1.6.x] -basepython = python3.3 -deps = {[testenv]deps16} - -[testenv:3.3-1.7.x] -basepython = python3.3 -deps = {[testenv]deps17} - -[testenv:3.3-master] -basepython = python3.3 -deps = {[testenv]master} - -[testenv:3.4-1.5.x] -basepython = python3.4 -deps = {[testenv]deps15} - -[testenv:3.4-1.6.x] -basepython = python3.4 -deps = {[testenv]deps16} - -[testenv:3.4-1.7.x] -basepython = python3.4 -deps = {[testenv]deps17} - -[testenv:3.4-master] -basepython = python3.4 -deps = {[testenv]master} - -[testenv:pypy-1.5.x] -basepython = pypy -deps = {[testenv]deps17} - -[testenv:pypy-1.6.x] -basepython = pypy -deps = {[testenv]deps17} - -[testenv:pypy-1.7.x] -basepython = pypy -deps = {[testenv]deps17} - -[testenv:pypy-master] -basepython = pypy -deps = {[testenv]master} - -[docs] -commands = - pip install -e {toxinidir} - pip install -e {toxinidir}[docs] - sphinx-build -W -b html -d {envtmpdir}/doctrees docs docs/_build/html - sphinx-build -W -b doctest -d {envtmpdir}/doctrees docs docs/_build/html - sphinx-build -W -b linkcheck docs docs/_build/html +[testenv:lint] +deps = + flake8==2.4.1 +commands=flake8 django_babel tests