diff options
| author | bwarsaw | 2007-03-21 14:11:53 +0000 |
|---|---|---|
| committer | bwarsaw | 2007-03-21 14:11:53 +0000 |
| commit | fc51f4c9de9751c03fb21394b393253e8c225453 (patch) | |
| tree | a931a2a61e156ca8332a92d6369163741f8e506d | |
| parent | cf950f7430ecabc8d4ff370c4f9e6e01f7b44fd4 (diff) | |
| download | mailman-fc51f4c9de9751c03fb21394b393253e8c225453.tar.gz mailman-fc51f4c9de9751c03fb21394b393253e8c225453.tar.zst mailman-fc51f4c9de9751c03fb21394b393253e8c225453.zip | |
Test suite repair. All tests are now passing again.
- In i18n.py, change this method so that everything it returns will be
guaranteed to be a unicode. Mailman 2.2 will be unicode-safe, meaning all
strings internally will be unicodes. The translation service is one
boundary point were strings come from the outside, so ensure that they are
unicodes and convert if necessary. This may break some things, but it's
better to fix those situations than to continue to return 8-bit strings from
_().
- In Mailman/testing/base.py, craft a fake module called Mailman.MTA.stub and
stick no-op functions on stub.create() and stub.remove(). We really don't
need the MTA modules for testing purposes (yet at least), and if you're
using the default configuration, you'll get tons of cruft on stdout when the
Manual MTA tries to add and remove mailing lists.
Set up the test configuration environment to use this stub MTA module.
- In test_handlers.py, remove an extraneous str().
- Convert ToDigest.py, Hold.py and Acknowledge.py to __i18n_templates__. (I'm
pretty darn close to just making everything use $-strings by default.)
- In CookHeaders.py, there's no need to unicode()-ify the subject since that
should already be a unicode when passed from _().
- In MailList.py, we can use the str.capitalize() method.
| -rw-r--r-- | Mailman/Handlers/Acknowledge.py | 4 | ||||
| -rw-r--r-- | Mailman/Handlers/CookHeaders.py | 1 | ||||
| -rw-r--r-- | Mailman/Handlers/Hold.py | 16 | ||||
| -rw-r--r-- | Mailman/Handlers/ToDigest.py | 5 | ||||
| -rw-r--r-- | Mailman/MailList.py | 3 | ||||
| -rw-r--r-- | Mailman/i18n.py | 32 | ||||
| -rw-r--r-- | Mailman/testing/base.py | 16 | ||||
| -rw-r--r-- | Mailman/testing/test_handlers.py | 2 |
8 files changed, 49 insertions, 30 deletions
diff --git a/Mailman/Handlers/Acknowledge.py b/Mailman/Handlers/Acknowledge.py index 609f6ea8a..d02920cde 100644 --- a/Mailman/Handlers/Acknowledge.py +++ b/Mailman/Handlers/Acknowledge.py @@ -29,6 +29,8 @@ from Mailman import Utils from Mailman.configuration import config from Mailman.i18n import _ +__i18n_templates__ = True + def process(mlist, msg, msgdata): @@ -57,7 +59,7 @@ def process(mlist, msg, msgdata): # Craft the outgoing message, with all headers and attributes # necessary for general delivery. Then enqueue it to the outgoing # queue. - subject = _('%(realname)s post acknowledgement') + subject = _('$realname post acknowledgement') usermsg = Message.UserNotification(sender, mlist.GetBouncesEmail(), subject, text, lang) usermsg.send(mlist) diff --git a/Mailman/Handlers/CookHeaders.py b/Mailman/Handlers/CookHeaders.py index c28ec25ab..11f08acc8 100644 --- a/Mailman/Handlers/CookHeaders.py +++ b/Mailman/Handlers/CookHeaders.py @@ -276,7 +276,6 @@ def prefix_subject(mlist, msg, msgdata): if subject.strip() == '': subject = _('(no subject)') cset = Utils.GetCharSet(mlist.preferred_language) - subject = unicode(subject, cset) # and substitute %d in prefix with post_id try: prefix = prefix % mlist.post_id diff --git a/Mailman/Handlers/Hold.py b/Mailman/Handlers/Hold.py index 180b6fd70..d13babba6 100644 --- a/Mailman/Handlers/Hold.py +++ b/Mailman/Handlers/Hold.py @@ -49,6 +49,8 @@ log = logging.getLogger('mailman.vette') def _(s): return s +__i18n_templates__ = True + class ForbiddenPoster(Errors.HoldMessage): @@ -84,8 +86,8 @@ class Administrivia(Errors.HoldMessage): listurl = mlist.GetScriptURL('listinfo', absolute=1) request = mlist.GetRequestEmail() return _("""Please do *not* post administrative requests to the mailing -list. If you wish to subscribe, visit %(listurl)s or send a message with the -word `help' in it to the request address, %(request)s, for further +list. If you wish to subscribe, visit $listurl or send a message with the +word `help' in it to the request address, $request, for further instructions.""") class SuspiciousHeaders(Errors.HoldMessage): @@ -100,13 +102,13 @@ class MessageTooBig(Errors.HoldMessage): def reason_notice(self): size = self.__msgsize limit = self.__limit - return _('''Message body is too big: %(size)d bytes with a limit of -%(limit)d KB''') + return _('''Message body is too big: $size bytes with a limit of +$limit KB''') def rejection_notice(self, mlist): kb = self.__limit return _('''Your message was too big; please trim it to less than -%(kb)d KB in size.''') +$kb KB in size.''') class ModeratedNewsgroup(ModeratedPost): reason = _('Posting to a moderated newsgroup') @@ -244,7 +246,7 @@ def hold_for_approval(mlist, msg, msgdata, exc): d['confirmurl'] = '%s/%s' % (mlist.GetScriptURL('confirm', absolute=1), cookie) lang = msgdata.get('lang', mlist.getMemberLanguage(sender)) - subject = _('Your message to %(listname)s awaits moderator approval') + subject = _('Your message to $listname awaits moderator approval') text = Utils.maketext('postheld.txt', d, lang=lang, mlist=mlist) nmsg = Message.UserNotification(sender, adminaddr, subject, text, lang) nmsg.send(mlist) @@ -263,7 +265,7 @@ def hold_for_approval(mlist, msg, msgdata, exc): d['reason'] = _(reason) d['subject'] = usersubject # craft the admin notification message and deliver it - subject = _('%(listname)s post from %(sender)s requires approval') + subject = _('$listname post from $sender requires approval') nmsg = Message.UserNotification(owneraddr, owneraddr, subject, lang=lang) nmsg.set_type('multipart/mixed') diff --git a/Mailman/Handlers/ToDigest.py b/Mailman/Handlers/ToDigest.py index 3b22c6cee..e43cb68ce 100644 --- a/Mailman/Handlers/ToDigest.py +++ b/Mailman/Handlers/ToDigest.py @@ -54,6 +54,7 @@ from Mailman.Queue.sbcache import get_switchboard from Mailman.configuration import config _ = i18n._ +__i18n_templates__ = True UEMPTYSTRING = u'' EMPTYSTRING = '' @@ -146,7 +147,7 @@ def send_i18n_digests(mlist, mboxfp): realname = mlist.real_name volume = mlist.volume issue = mlist.next_digest_number - digestid = _('%(realname)s Digest, Vol %(volume)d, Issue %(issue)d') + digestid = _('$realname Digest, Vol $volume, Issue $issue') digestsubj = Header(digestid, lcset, header_name='Subject') # Set things up for the MIME digest. Only headers not added by # CookHeaders need be added here. @@ -292,7 +293,7 @@ def send_i18n_digests(mlist, mboxfp): toctext = toc.getvalue() # MIME tocpart = MIMEText(toctext.encode(lcset), _charset=lcset) - tocpart['Content-Description']= _("Today's Topics (%(msgcount)d messages)") + tocpart['Content-Description']= _("Today's Topics ($msgcount messages)") mimemsg.attach(tocpart) # RFC 1153 print >> plainmsg, toctext diff --git a/Mailman/MailList.py b/Mailman/MailList.py index 640baa314..fcdbca9a6 100644 --- a/Mailman/MailList.py +++ b/Mailman/MailList.py @@ -403,8 +403,7 @@ class MailList(object, HTMLFormatter, Deliverer, ListAdmin, config.DEFAULT_BOUNCE_MATCHING_HEADERS self.header_filter_rules = [] self.anonymous_list = config.DEFAULT_ANONYMOUS_LIST - internalname = self.internal_name() - self.real_name = internalname[0].upper() + internalname[1:] + self.real_name = self.internal_name().capitalize() self.description = '' self.info = '' self.welcome_msg = '' diff --git a/Mailman/i18n.py b/Mailman/i18n.py index 59d10db25..66584e895 100644 --- a/Mailman/i18n.py +++ b/Mailman/i18n.py @@ -73,7 +73,7 @@ if _translation is None: def _(s): if s == '': - return s + return u'' assert s # Do translation of the given string into the current language, and do # Ping-string interpolation into the resulting string. @@ -97,24 +97,24 @@ def _(s): d = frame.f_globals.copy() d.update(frame.f_locals) use_templates = d.get('__i18n_templates__', False) - # Translating the string returns an encoded 8-bit string. Rather than - # turn that into a Unicode, we turn any Unicodes in the dictionary values - # into encoded 8-bit strings. XXX: Returning a Unicode here broke too - # much other stuff and _() has many tentacles. Eventually I think we want - # to use Unicode everywhere. - tns = _translation.gettext(s) - charset = _translation.charset() - if not charset: - charset = 'us-ascii' + # Mailman must be unicode safe internally (i.e. all strings inside Mailman + # must be unicodes). The translation service is one boundary to the + # outside world, so to honor this constraint, make sure that all strings + # to come out of _() are unicodes, even if the translated string or + # dictionary values are 8-bit strings. + tns = _translation.ugettext(s) + charset = _translation.charset() or 'us-ascii' for k, v in d.items(): - if isinstance(v, unicode): - d[k] = v.encode(charset, 'replace') + if isinstance(v, str): + d[k] = unicode(v, charset, 'replace') # Are we using $-strings or %-strings? if use_templates: - return Template(tns).safe_substitute(attrdict(d)) - if type(tns) == str: - tns = unicode(tns, charset) - return SafeDict(d, charset=charset).interpolate(tns) + translated_string = Template(tns).safe_substitute(attrdict(d)) + else: + translated_string = SafeDict(d, charset=charset).interpolate(tns) + if isinstance(translated_string, str): + translated_string = unicode(translated_string, charset) + return translated_string diff --git a/Mailman/testing/base.py b/Mailman/testing/base.py index a61740956..2979ad18b 100644 --- a/Mailman/testing/base.py +++ b/Mailman/testing/base.py @@ -19,7 +19,9 @@ import os import grp +import new import pwd +import sys import stat import shutil import difflib @@ -39,6 +41,11 @@ NL = '\n' +def dummy_mta_function(*args, **kws): + pass + + + class TestBase(unittest.TestCase): def _configure(self, fp): # Make sure that we don't pollute the real database with our test @@ -46,6 +53,9 @@ class TestBase(unittest.TestCase): test_engine_url = 'sqlite:///' + self._dbfile print >> fp, 'SQLALCHEMY_ENGINE_URL = "%s"' % test_engine_url config.SQLALCHEMY_ENGINE_URL = test_engine_url + # Use the Mailman.MTA.stub module + print >> fp, 'MTA = "stub"' + config.MTA = 'stub' print >> fp, 'add_domain("example.com", "www.example.com")' # Only add this domain once to the current process if 'example.com' not in config.domains: @@ -80,6 +90,12 @@ class TestBase(unittest.TestCase): self._configure(fp) finally: fp.close() + # Create a fake new Mailman.MTA module which stubs out the create() + # and remove() functions. + stubmta_module = new.module('Mailman.MTA.stub') + sys.modules['Mailman.MTA.stub'] = stubmta_module + stubmta_module.create = dummy_mta_function + stubmta_module.remove = dummy_mta_function # Be sure to close the connection to the current database, and then # reconnect to the new temporary SQLite database. Otherwise we end up # with turds in the main database and our qrunner subprocesses won't diff --git a/Mailman/testing/test_handlers.py b/Mailman/testing/test_handlers.py index 2e964389e..849ccfb91 100644 --- a/Mailman/testing/test_handlers.py +++ b/Mailman/testing/test_handlers.py @@ -129,7 +129,7 @@ From: aperson@example.org eq(qdata.get('recips'), ['aperson@example.org']) eq(qdata.get('version'), 3) # Check the .pck - eq(str(str(qmsg['subject'])), '_xtest post acknowledgement') + eq(str(qmsg['subject']), '_xtest post acknowledgement') eq(qmsg['to'], 'aperson@example.org') eq(qmsg['from'], '_xtest-bounces@example.com') eq(qmsg.get_content_type(), 'text/plain') |
