summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Madden <jason+github@nextthought.com>2017-05-02 04:13:34 -0500
committerGitHub <noreply@github.com>2017-05-02 04:13:34 -0500
commit734d920db340b817c0ed403307e41d3bbbc69c28 (patch)
treed4816cc4a225c052e00de1da46f685d8607e2934
parentceb5981168a9b5b6c07b307cdf7fa11c96bb8fc7 (diff)
parent5954f86733df49920427de4a931b23f8c5db9c95 (diff)
downloadzope-i18nmessageid-734d920db340b817c0ed403307e41d3bbbc69c28.tar.gz
Merge pull request #6 from zopefoundation/issue4
Use C extension in Python 3, and make Python version handle ``default`` like the C version
-rw-r--r--.coveragerc6
-rw-r--r--.gitignore1
-rw-r--r--.travis.yml32
-rw-r--r--CHANGES.rst10
-rw-r--r--MANIFEST.in2
-rw-r--r--setup.py25
-rw-r--r--src/zope/__init__.py2
-rw-r--r--src/zope/i18nmessageid/message.py8
-rw-r--r--src/zope/i18nmessageid/tests.py33
-rw-r--r--tox.ini16
10 files changed, 89 insertions, 46 deletions
diff --git a/.coveragerc b/.coveragerc
new file mode 100644
index 0000000..af40312
--- /dev/null
+++ b/.coveragerc
@@ -0,0 +1,6 @@
+[run]
+source = src
+
+[report]
+exclude_lines =
+ pragma: no cover
diff --git a/.gitignore b/.gitignore
index 2900f4b..3553a3a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,3 +13,4 @@ docs/_build
nosetests.xml
coverage.xml
.coverage
+htmlcov/
diff --git a/.travis.yml b/.travis.yml
index 4847904..b6b3d84 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,15 +1,27 @@
language: python
sudo: false
python:
- - 2.7
- - 3.3
- - 3.4
- - 3.5
- - pypy
- - pypy3
-install:
- - pip install .
+ - 2.7
+ - 3.3
+ - 3.4
+ - 3.5
+ - 3.6
+ - pypy-5.4.1
script:
- - python setup.py -q test -q
+ - coverage run -m zope.testrunner --test-path=src --auto-color --auto-progress
+
+after_success:
+ - coveralls
notifications:
- email: false
+ email: false
+
+install:
+ - pip install -U pip setuptools
+ - pip install -U coveralls coverage zope.testrunner
+ - pip install -U -e ".[test]"
+
+
+cache: pip
+
+before_cache:
+ - rm -f $HOME/.cache/pip/log/debug.log
diff --git a/CHANGES.rst b/CHANGES.rst
index eec874a..98064aa 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -6,7 +6,15 @@ Changes
- Drop support for Python 2.6 and 3.2.
-- Add support for Python 3.5.
+- Add support for Python 3.5 and 3.6.
+
+- Fix the C extension not being used in Python 3. See `issue 4
+ <https://github.com/zopefoundation/zope.i18nmessageid/issues/4>`_.
+
+- Make the Python implementation of Message accept any object for the
+ ``default`` argument, just as the C extension does. This should be a
+ unicode or byte string. See `issue 5
+ <https://github.com/zopefoundation/zope.i18nmessageid/issues/5>`_.
4.0.3 (2014-03-19)
------------------
diff --git a/MANIFEST.in b/MANIFEST.in
index 691124f..6b9b1a2 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -3,6 +3,8 @@ include *.txt
include *.py
include buildout.cfg
include tox.ini
+include .travis.yml
+include .coveragerc
recursive-include docs *.rst *.bat *.py Makefile .gitignore
recursive-include src *.zcml
diff --git a/setup.py b/setup.py
index e5c991a..ecb28ff 100644
--- a/setup.py
+++ b/setup.py
@@ -65,7 +65,7 @@ class optional_build_ext(build_ext):
def run(self):
try:
build_ext.run(self)
-
+
except DistutilsPlatformError:
# The sys.exc_info()[1] is to preserve compatibility with both
# Python 2.5 and 3.x, which is needed in setup.py.
@@ -74,7 +74,7 @@ class optional_build_ext(build_ext):
def build_extension(self, ext):
try:
build_ext.build_extension(self, ext)
-
+
except (CCompilerError, DistutilsExecError):
# The sys.exc_info()[1] is to preserve compatibility with both
# Python 2.5 and 3.x, which is needed in setup.py.
@@ -89,13 +89,13 @@ class optional_build_ext(build_ext):
An optional code optimization (C extension) could not be compiled.
Optimizations for this package will not be available!
-
+
""")
sys.stderr.write(str(e) + '\n')
sys.stderr.write('*' * 80 + '\n')
setup(name='zope.i18nmessageid',
- version = '4.1.0.dev0',
+ version='4.1.0.dev0',
author='Zope Foundation and Contributors',
author_email='zope-dev@zope.org',
description='Message Identifiers for internationalization',
@@ -104,8 +104,8 @@ setup(name='zope.i18nmessageid',
+ '\n\n' +
read('CHANGES.rst')
),
- keywords = "zope i18n message factory",
- classifiers = [
+ keywords="zope i18n message factory",
+ classifiers=[
'Development Status :: 5 - Production/Stable',
'Environment :: Web Environment',
'Intended Audience :: Developers',
@@ -117,22 +117,23 @@ setup(name='zope.i18nmessageid',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
+ 'Programming Language :: Python :: 3.6',
"Programming Language :: Python :: Implementation :: CPython",
"Programming Language :: Python :: Implementation :: PyPy",
'Natural Language :: English',
'Operating System :: OS Independent',
'Topic :: Internet :: WWW/HTTP',
- 'Framework :: Zope3'],
+ 'Framework :: Zope3',
+ ],
license='ZPL 2.1',
url='http://pypi.python.org/pypi/zope.i18nmessageid',
packages=find_packages('src'),
- package_dir = {'': 'src'},
+ package_dir={'': 'src'},
namespace_packages=['zope',],
install_requires=['setuptools'],
- include_package_data = True,
+ include_package_data=True,
test_suite='zope.i18nmessageid.tests.test_suite',
- zip_safe = False,
- cmdclass = {'build_ext':optional_build_ext},
+ zip_safe=False,
+ cmdclass={'build_ext':optional_build_ext},
**extra
)
-
diff --git a/src/zope/__init__.py b/src/zope/__init__.py
index de40ea7..2cdb0e4 100644
--- a/src/zope/__init__.py
+++ b/src/zope/__init__.py
@@ -1 +1 @@
-__import__('pkg_resources').declare_namespace(__name__)
+__import__('pkg_resources').declare_namespace(__name__) # pragma: no cover
diff --git a/src/zope/i18nmessageid/message.py b/src/zope/i18nmessageid/message.py
index e46cad6..0e62408 100644
--- a/src/zope/i18nmessageid/message.py
+++ b/src/zope/i18nmessageid/message.py
@@ -41,11 +41,7 @@ class Message(unicode):
mapping = ustr.mapping and ustr.mapping.copy() or mapping
ustr = unicode(ustr)
self.domain = domain
- if default is None:
- # MessageID does: self.default = ustr
- self.default = default
- else:
- self.default = unicode(default)
+ self.default = default
self.mapping = mapping
self._readonly = True
return self
@@ -70,7 +66,7 @@ class Message(unicode):
pyMessage = Message
try:
- from _zope_i18nmessageid_message import Message
+ from ._zope_i18nmessageid_message import Message
except ImportError: # pragma: no cover
pass
diff --git a/src/zope/i18nmessageid/tests.py b/src/zope/i18nmessageid/tests.py
index 560750b..0e8f6b4 100644
--- a/src/zope/i18nmessageid/tests.py
+++ b/src/zope/i18nmessageid/tests.py
@@ -13,15 +13,17 @@
##############################################################################
"""Message ID tests.
"""
+import sys
import unittest
+from zope.i18nmessageid import message as messageid
+
class PyMessageTests(unittest.TestCase):
_TEST_REAOONLY = True
def _getTargetClass(self):
- from zope.i18nmessageid.message import pyMessage
- return pyMessage
+ return messageid.pyMessage
def _makeOne(self, *args, **kw):
return self._getTargetClass()(*args, **kw)
@@ -71,20 +73,23 @@ class PyMessageTests(unittest.TestCase):
message = self._makeOne('testing')
def _try():
message.domain = 'domain'
- self.assertRaises(TypeError, _try)
+ # C version raises AttributeError, Python version TypeError
+ self.assertRaises((TypeError, AttributeError), _try)
def test_default_immutable(self):
message = self._makeOne('testing')
def _try():
message.default = 'default'
- self.assertRaises(TypeError, _try)
+ # C version raises AttributeError, Python version TypeError
+ self.assertRaises((TypeError, AttributeError), _try)
def test_mapping_immutable(self):
mapping = {'key': 'value'}
message = self._makeOne('testing')
def _try():
message.mapping = mapping
- self.assertRaises(TypeError, _try)
+ # C version raises AttributeError, Python version TypeError
+ self.assertRaises((TypeError, AttributeError), _try)
def test_unknown_immutable(self):
message = self._makeOne('testing')
@@ -101,15 +106,25 @@ class PyMessageTests(unittest.TestCase):
self.assertTrue(klass is self._getTargetClass())
self.assertEqual(state, ('testing', 'domain', 'default', mapping))
+ def test_non_unicode_default(self):
+ message = self._makeOne(u'str', default=123)
+ self.assertEqual(message.default, 123)
+@unittest.skipIf(messageid.Message is messageid.pyMessage,
+ "Duplicate tests")
class MessageTests(PyMessageTests):
_TEST_REAOONLY = False
def _getTargetClass(self):
- from zope.i18nmessageid.message import Message
- return Message
+ return messageid.Message
+
+@unittest.skipIf('java' in sys.platform or hasattr(sys, 'pypy_version_info'),
+ "We don't expect the C implementation here")
+class OptimizationTests(unittest.TestCase):
+ def test_optimizations_available(self):
+ self.assertIsNot(messageid.Message, messageid.pyMessage)
class MessageFactoryTests(unittest.TestCase):
@@ -144,7 +159,5 @@ class MessageFactoryTests(unittest.TestCase):
def test_suite():
return unittest.TestSuite((
- unittest.makeSuite(PyMessageTests),
- unittest.makeSuite(MessageTests),
- unittest.makeSuite(MessageFactoryTests),
+ unittest.defaultTestLoader.loadTestsFromName(__name__),
))
diff --git a/tox.ini b/tox.ini
index 3bf1484..0f644e3 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,16 +1,20 @@
[tox]
-envlist =
- py27,py33,py34,py35,pypy,pypy3,coverage,docs
+envlist =
+ py27,py33,py34,py35,py36,pypy,pypy3,coverage,docs
[testenv]
-commands =
- python setup.py -q test -q
+deps =
+ .[test]
+ zope.testrunner
+commands =
+ zope-testrunner --test-path=src []
+
[testenv:coverage]
usedevelop = true
basepython =
python2.7
-commands =
+commands =
nosetests --with-xunit --with-xcoverage
deps =
nose
@@ -20,7 +24,7 @@ deps =
[testenv:docs]
basepython =
python2.7
-commands =
+commands =
sphinx-build -b html -d docs/_build/doctrees docs docs/_build/html
sphinx-build -b doctest -d docs/_build/doctrees docs docs/_build/doctest
deps =