diff options
Diffstat (limited to 'src/zope')
-rw-r--r-- | src/zope/i18nmessageid/_zope_i18nmessageid_message.c | 37 | ||||
-rw-r--r-- | src/zope/i18nmessageid/message.py | 60 | ||||
-rw-r--r-- | src/zope/i18nmessageid/tests.py | 24 |
3 files changed, 54 insertions, 67 deletions
diff --git a/src/zope/i18nmessageid/_zope_i18nmessageid_message.c b/src/zope/i18nmessageid/_zope_i18nmessageid_message.c index c0107e1..66cd93d 100644 --- a/src/zope/i18nmessageid/_zope_i18nmessageid_message.c +++ b/src/zope/i18nmessageid/_zope_i18nmessageid_message.c @@ -14,16 +14,6 @@ #include "Python.h" -/* Support for Python < 2.6: */ - -#ifndef Py_TYPE - #define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) -#endif - -#ifndef PyVarObject_HEAD_INIT - #define PyVarObject_HEAD_INIT(type, size) \ - PyObject_HEAD_INIT(type) size, -#endif #if PY_MAJOR_VERSION >= 3 #define MOD_ERROR_VAL NULL @@ -31,33 +21,6 @@ #define MOD_ERROR_VAL #endif -/* these macros make gc support easier; they are only available in - Python 2.4 and borrowed from there */ - -#ifndef Py_CLEAR -#define Py_CLEAR(op) \ - do { \ - if (op) { \ - PyObject *tmp = (op); \ - (op) = NULL; \ - Py_DECREF(tmp); \ - } \ - } while (0) -#endif - -#ifndef Py_VISIT -#define Py_VISIT(op) \ - do { \ - if (op) { \ - int vret = visit((op), arg); \ - if (vret) \ - return vret; \ - } \ - } while (0) -#endif - -/* ----------------------------------------------------- */ - typedef struct { PyUnicodeObject base; PyObject *domain; diff --git a/src/zope/i18nmessageid/message.py b/src/zope/i18nmessageid/message.py index 4bfcb19..ed5e08d 100644 --- a/src/zope/i18nmessageid/message.py +++ b/src/zope/i18nmessageid/message.py @@ -13,11 +13,11 @@ ############################################################################## """I18n Messages and factories. """ +import six + __docformat__ = "reStructuredText" _marker = object() -import six - class Message(six.text_type): """Message (Python implementation) @@ -37,37 +37,37 @@ class Message(six.text_type): msgid_plural=_marker, default_plural=_marker, number=_marker): self = six.text_type.__new__(cls, ustr) if isinstance(ustr, self.__class__): - domain = ustr.domain[:] if domain is _marker else domain - default = ustr.default[:] if default is _marker else default - mapping = ustr.mapping.copy() if mapping is _marker else mapping - msgid_plural = ( - ustr.msgid_plural[:] if msgid_plural is _marker else - msgid_plural) - default_plural = ( - ustr.default_plural[:] if default_plural is _marker else - default_plural) - number = ustr.number if number is _marker else number - ustr = six.text_type(ustr) + self.domain = ustr.domain[:] if ustr.domain else None + self.default = ustr.default[:] if ustr.default else None + self.mapping = ustr.mapping.copy() if ustr.mapping is not None else None + self.msgid_plural = ustr.msgid_plural[:] if ustr.msgid_plural else None + self.default_plural = ustr.default_plural[:] if ustr.default_plural else None + self.number = ustr.number else: - domain = None if domain is _marker else domain - default = None if default is _marker else default - mapping = None if mapping is _marker else mapping - msgid_plural = None if msgid_plural is _marker else msgid_plural - default_plural = (None if default_plural is _marker else - default_plural) - number = None if number is _marker else number - - self.domain = domain - self.default = default - self.mapping = mapping - self.msgid_plural = msgid_plural - self.default_plural = default_plural - - if number is not None and not isinstance( - number, six.integer_types + (float,)): + self.domain = None + self.default = None + self.mapping = None + self.msgid_plural = None + self.default_plural = None + self.number = None + + if domain is not _marker: + self.domain = domain + if default is not _marker: + self.default = default + if mapping is not _marker: + self.mapping = mapping + if msgid_plural is not _marker: + self.msgid_plural = msgid_plural + if default_plural is not _marker: + self.default_plural = default_plural + if number is not _marker: + self.number = number + + if self.number is not None and not isinstance( + self.number, six.integer_types + (float,)): raise TypeError('`number` should be an integer or a float') - self.number = number self._readonly = True return self diff --git a/src/zope/i18nmessageid/tests.py b/src/zope/i18nmessageid/tests.py index 56074c1..d542e48 100644 --- a/src/zope/i18nmessageid/tests.py +++ b/src/zope/i18nmessageid/tests.py @@ -133,6 +133,30 @@ class PyMessageTests(unittest.TestCase): if self._TEST_READONLY: self.assertTrue(message._readonly) + def test_copy_no_default(self): + # https://github.com/zopefoundation/zope.i18nmessageid/issues/14 + pref_msg = self._makeOne("${name} Preferences") + self.assertIsNone(pref_msg.default) + copy = self._makeOne(pref_msg, mapping={u'name': u'name'}) + self.assertIsNone(copy.default) + + def test_copy_no_overrides(self): + # https://github.com/zopefoundation/zope.i18nmessageid/issues/14 + pref_msg = self._makeOne("${name} Preferences") + + copy = self._makeOne(pref_msg) + for attr in ( + 'domain', + 'default', + 'mapping', + 'msgid_plural', + 'default_plural', + 'number', + ): + self.assertIsNone(getattr(pref_msg, attr)) + self.assertIsNone(getattr(copy, attr)) + + def test_domain_immutable(self): message = self._makeOne('testing') with self.assertRaises((TypeError, AttributeError)): |