------------------------------------------------------------
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

Reply via email to