summaryrefslogtreecommitdiff
path: root/src/zope
diff options
context:
space:
mode:
Diffstat (limited to 'src/zope')
-rw-r--r--src/zope/i18nmessageid/_zope_i18nmessageid_message.c37
-rw-r--r--src/zope/i18nmessageid/message.py60
-rw-r--r--src/zope/i18nmessageid/tests.py24
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)):