------------------------------------------------------------
revno: 6685
committer: Barry Warsaw <[email protected]>
branch nick: cleanup
timestamp: Tue 2009-02-10 19:42:34 -0500
message:
Clean up and reorganization languages and the language manager.
added:
src/mailman/languages/
src/mailman/languages/__init__.py
renamed:
src/mailman/languages.py => src/mailman/languages/manager.py
modified:
src/mailman/Utils.py
src/mailman/config/config.py
src/mailman/docs/languages.txt
src/mailman/interfaces/languages.py
src/mailman/queue/docs/digester.txt
src/mailman/languages/manager.py
=== modified file 'src/mailman/Utils.py'
--- src/mailman/Utils.py 2009-02-10 03:47:11 +0000
+++ src/mailman/Utils.py 2009-02-11 00:42:34 +0000
@@ -488,7 +488,7 @@
# XXX Replace this with direct calls. For now, existing uses of GetCharSet()
# are too numerous to change.
def GetCharSet(lang):
- return config.languages.get_charset(lang)
+ return config.languages[lang].charset
=== modified file 'src/mailman/config/config.py'
--- src/mailman/config/config.py 2009-01-21 01:54:22 +0000
+++ src/mailman/config/config.py 2009-02-11 00:42:34 +0000
@@ -37,7 +37,7 @@
from mailman import version
from mailman.core import errors
from mailman.domain import Domain
-from mailman.languages import LanguageManager
+from mailman.languages.manager import LanguageManager
from mailman.styles.manager import StyleManager
from mailman.utilities.filesystem import makedirs
@@ -147,11 +147,12 @@
# Set up all the languages.
languages = self._config.getByCategory('language', [])
for language in languages:
- code = language.name.split('.')[1]
- self.languages.add_language(code, language.description,
- language.charset, language.enabled)
- # Always enable the server default language, which must be defined.
- self.languages.enable_language(self._config.mailman.default_language)
+ if language.enabled:
+ code = language.name.split('.')[1]
+ self.languages.add_language(
+ code, language.charset, language.description)
+ # The default language must always be available.
+ assert self._config.mailman.default_language in self.languages
self.ensure_directories_exist()
self.style_manager.populate()
=== modified file 'src/mailman/docs/languages.txt'
--- src/mailman/docs/languages.txt 2009-01-04 05:22:08 +0000
+++ src/mailman/docs/languages.txt 2009-02-11 00:42:34 +0000
@@ -5,33 +5,20 @@
languages at run time, as well as enabling those languages for use in a
running Mailman instance.
+ >>> from mailman.interfaces.languages import ILanguageManager
+ >>> from mailman.languages.manager import LanguageManager
>>> from zope.interface.verify import verifyObject
- >>> from mailman.interfaces.languages import ILanguageManager
- >>> from mailman.languages import LanguageManager
>>> mgr = LanguageManager()
>>> verifyObject(ILanguageManager, mgr)
True
-A language manager keeps track of the languages it knows about as well as the
-languages which are enabled. By default, none are known or enabled.
+A language manager keeps track of the languages it knows about.
- >>> sorted(mgr.known_codes)
+ >>> list(mgr.codes)
[]
- >>> sorted(mgr.enabled_codes)
+ >>> list(mgr.languages)
[]
-The language manager also keeps track of information for each known language,
-but you obviously can't get information for an unknown language.
-
- >>> mgr.get_description('en')
- Traceback (most recent call last):
- ...
- KeyError: 'en'
- >>> mgr.get_charset('en')
- Traceback (most recent call last):
- ...
- KeyError: 'en'
-
Adding languages
----------------
@@ -40,65 +27,59 @@
language code, the English description of the language, and the character set
used by the language.
- >>> mgr.add_language('en', 'English', 'us-ascii')
- >>> mgr.add_language('it', 'Italian', 'iso-8859-1')
-
-By default, added languages are also enabled.
-
- >>> sorted(mgr.known_codes)
- ['en', 'it']
- >>> sorted(mgr.enabled_codes)
- ['en', 'it']
+ >>> mgr.add_language('en', 'us-ascii', 'English')
+ >>> mgr.add_language('it', 'iso-8859-1', 'Italian')
And you can get information for all known languages.
- >>> mgr.get_description('en')
- 'English'
- >>> mgr.get_charset('en')
- 'us-ascii'
- >>> mgr.get_description('it')
- 'Italian'
- >>> mgr.get_charset('it')
- 'iso-8859-1'
-
-You can also add a language without enabling it.
-
- >>> mgr.add_language('pl', 'Polish', 'iso-8859-2', enable=False)
- >>> sorted(mgr.known_codes)
- ['en', 'it', 'pl']
- >>> sorted(mgr.enabled_codes)
- ['en', 'it']
-
-You can get language data for disabled languages.
-
- >>> mgr.get_description('pl')
- 'Polish'
- >>> mgr.get_charset('pl')
- 'iso-8859-2'
-
-And of course you can enable a known language.
-
- >>> mgr.enable_language('pl')
- >>> sorted(mgr.enabled_codes)
- ['en', 'it', 'pl']
-
-But you cannot enable languages that the manager does not know about.
-
- >>> mgr.enable_language('xx')
+ >>> print mgr['en'].description
+ English
+ >>> print mgr['en'].charset
+ us-ascii
+ >>> print mgr['it'].description
+ Italian
+ >>> print mgr['it'].charset
+ iso-8859-1
+
+
+Other iterations
+----------------
+
+You can iterate over all the known language codes.
+
+ >>> mgr.add_language('pl', 'iso-8859-2', 'Polish')
+ >>> sorted(mgr.codes)
+ ['en', 'it', 'pl']
+
+You can iterate over all the known languages.
+
+ >>> from operator import attrgetter
+ >>> languages = sorted((language for language in mgr.languages),
+ ... key=attrgetter('code'))
+ >>> for language in languages:
+ ... print language.code, language.charset, language.description
+ en us-ascii English
+ it iso-8859-1 Italian
+ pl iso-8859-2 Polish
+
+You can ask whether a particular language code is known.
+
+ >>> 'it' in mgr
+ True
+ >>> 'xx' in mgr
+ False
+
+You can get a particular language by its code.
+
+ >>> print mgr['it'].description
+ Italian
+ >>> print mgr['xx'].code
Traceback (most recent call last):
...
KeyError: 'xx'
-
-
-Other iterations
-----------------
-
-You can iterate over the descriptions (names) of all enabled languages.
-
- >>> sorted(mgr.enabled_names)
- ['English', 'Italian', 'Polish']
-
-You can ask whether a particular language code is enabled.
-
- >>> 'it' in mgr.enabled_codes
- True
+ >>> print mgr.get('it').description
+ Italian
+ >>> print mgr.get('xx')
+ None
+ >>> print mgr.get('xx', 'missing')
+ missing
=== modified file 'src/mailman/interfaces/languages.py'
--- src/mailman/interfaces/languages.py 2009-01-17 02:04:21 +0000
+++ src/mailman/interfaces/languages.py 2009-02-11 00:42:34 +0000
@@ -30,60 +30,66 @@
+class ILanguage(Interface):
+ """The representation of a language."""
+
+ code = Attribute('The 2-character language code.')
+
+ charset = Attribute('The character set or encoding for this language.')
+
+ description = Attribute("The language's description.")
+
+
+
class ILanguageManager(Interface):
"""A language manager.
Current, disabling languages is not supported.
"""
- def add_language(code, description, charset, enable=True):
+ def add_language(code, charset, description):
"""Teach the language manager about a language.
:param code: The short two-character language code for the
language. If the language manager already knows about this code,
the old language binding is lost.
+ :type code: string
+ :param charset: The character set that the language uses,
+ e.g. 'us-ascii', 'iso-8859-1', or 'utf-8'
+ :type charset: string
:param description: The English description of the language,
e.g. 'English' or 'French'.
- :param charset: The character set that the language uses,
- e.g. 'us-ascii', 'iso-8859-1', or 'utf-8'
- :param enable: Enable the language at the same time.
- """
-
- def enable_language(code):
- """Enable a language that the manager already knows about.
-
- :raises KeyError: when the manager does not know about the given
- language code.
- """
-
- def get_description(code):
- """Return the language description for the given code.
-
- :param code: The two letter language code to look up.
- :returns: The English description of the language.
- :raises KeyError: when the code has not been added.
- """
-
- def get_charset(code):
- """Return the character set for the given code.
-
- :param code: The two letter language code to look up.
- :returns: The character set of the language.
- :raises KeyError: when the code has not been added.
- """
-
- known_codes = Attribute(
- """An iterator over all known codes.""")
-
- enabled_codes = Attribute(
- """An iterator over all enabled codes.""")
-
- enabled_names = Attribute(
- """An iterator over all enabled language names.""")
-
-
-
-class ILanguage(Interface):
- """The representation of a language."""
-
- code = Attribute("""The 2-character language code.""")
+ :type description: string
+ """
+
+ codes = Attribute('An iterator over all known codes.')
+
+ languages = Attribute('An iterator of all the languages.')
+
+ def __getitem__(code):
+ """Return the language associated with the language code.
+
+ :param code: The 2-letter language code.
+ :type code: string
+ :return: The language instance.
+ :rtype: `ILanguage`
+ :raises KeyError: if code is not associated with a known language.
+ """
+
+ def get(code, default=None):
+ """Return the language associated with the language code.
+
+ :param code: The 2-letter language code.
+ :type code: string
+ :param default: The value to return if the code is not known.
+ :type default: anything
+ :return: The language instance or `default`.
+ :rtype: `ILanguage` or `default`
+ """
+
+ def __contains__(code):
+ """True if the language code is known.
+
+ :return: A flag indicating whether the language code is known or not.
+ :rtype: bool
+ """
=== added directory 'src/mailman/languages'
=== added file 'src/mailman/languages/__init__.py'
=== renamed file 'src/mailman/languages.py' =>
'src/mailman/languages/manager.py'
--- src/mailman/languages.py 2009-01-17 02:04:21 +0000
+++ src/mailman/languages/manager.py 2009-02-11 00:42:34 +0000
@@ -17,7 +17,7 @@
"""Language manager."""
-from __future__ import unicode_literals
+from __future__ import absolute_import, unicode_literals
__metaclass__ = type
__all__ = [
@@ -25,43 +25,46 @@
]
from zope.interface import implements
+
from mailman.interfaces.languages import ILanguageManager
+from mailman.languages.language import Language
class LanguageManager:
+ """Language manager."""
+
implements(ILanguageManager)
def __init__(self):
- self._language_data = {}
- self._enabled = set()
-
- def add_language(self, code, description, charset, enable=True):
- self._language_data[code] = (description, charset)
- if enable:
- self._enabled.add(code)
-
- def enable_language(self, code):
- if code not in self._language_data:
- raise KeyError(code)
- self._enabled.add(code)
-
- def get_description(self, code):
- return self._language_data[code][0]
-
- def get_charset(self, code):
- return self._language_data[code][1]
-
- @property
- def known_codes(self):
- return iter(self._language_data)
-
- @property
- def enabled_codes(self):
- return iter(self._enabled)
-
- @property
- def enabled_names(self):
- for code in self._enabled:
- description, charset = self._language_data[code]
- yield description
+ # Mapping from 2-letter code to Language instance.
+ self._languages = {}
+
+ def add_language(self, code, charset, description):
+ """See `ILanguageManager`."""
+ if code in self._languages:
+ raise ValueError('Language code already registered: ' + code)
+ language = Language(code, charset, description)
+ self._languages[code] = language
+
+ @property
+ def codes(self):
+ """See `ILanguageManager`."""
+ return iter(self._languages)
+
+ @property
+ def languages(self):
+ """See `ILanguageManager`."""
+ return iter(self._languages.values())
+
+ def get(self, code, default=None):
+ """See `ILanguageManager`."""
+ return self._languages.get(code, default)
+
+ def __getitem__(self, code):
+ """See `ILanguageManager`."""
+ return self._languages[code]
+
+ def __contains__(self, code):
+ """See `ILanguageManager`."""
+ return code in self._languages
=== modified file 'src/mailman/queue/docs/digester.txt'
--- src/mailman/queue/docs/digester.txt 2009-02-04 19:47:25 +0000
+++ src/mailman/queue/docs/digester.txt 2009-02-11 00:42:34 +0000
@@ -274,8 +274,6 @@
the list's preferred language, recipients will get an internationalized
digest. French is not enabled by default site-wide, so enable that now.
- >>> config.languages.enable_language('fr')
-
# Simulate the site administrator setting the default server language to
# French in the configuration file. Without this, the English template
# will be found and the masthead won't be translated.
--
Primary development focus
https://code.launchpad.net/~mailman-coders/mailman/3.0
Your team Mailman Checkins is subscribed to branch lp:mailman.
To unsubscribe from this branch go to
https://code.launchpad.net/~mailman-coders/mailman/3.0/+edit-subscription.
_______________________________________________
Mailman-checkins mailing list
[email protected]
Unsubscribe:
http://mail.python.org/mailman/options/mailman-checkins/archive%40jab.org