[Checkins] SVN: zope.sendmail/trunk/ Copied over the UtilityTerm and UtilityVocabulary implementation from zope.app.component to avoid a dependency.

Hanno Schlichting plone at hannosch.info
Fri Nov 14 19:23:04 EST 2008


Log message for revision 92953:
  Copied over the UtilityTerm and UtilityVocabulary implementation from zope.app.component to avoid a dependency.
  

Changed:
  U   zope.sendmail/trunk/CHANGES.txt
  U   zope.sendmail/trunk/buildout.cfg
  U   zope.sendmail/trunk/setup.py
  D   zope.sendmail/trunk/src/zope/sendmail/DEPENDENCIES.cfg
  U   zope.sendmail/trunk/src/zope/sendmail/vocabulary.py

-=-
Modified: zope.sendmail/trunk/CHANGES.txt
===================================================================
--- zope.sendmail/trunk/CHANGES.txt	2008-11-14 23:08:44 UTC (rev 92952)
+++ zope.sendmail/trunk/CHANGES.txt	2008-11-15 00:23:04 UTC (rev 92953)
@@ -4,6 +4,9 @@
 3.5.1 (unreleased)
 ------------------
 
+- Copied over the UtilityTerm and UtilityVocabulary implementation from
+  zope.app.component to avoid a dependency.
+
 - work around a problem when smtp quit fails, the mail was considered not
   delivered where just the quit failed
 

Modified: zope.sendmail/trunk/buildout.cfg
===================================================================
--- zope.sendmail/trunk/buildout.cfg	2008-11-14 23:08:44 UTC (rev 92952)
+++ zope.sendmail/trunk/buildout.cfg	2008-11-15 00:23:04 UTC (rev 92953)
@@ -2,8 +2,6 @@
 develop = .
 parts = test coverage-test coverage-report
 
-find-links = http://download.zope.org/distribution/
-
 [test]
 recipe = zc.recipe.testrunner
 eggs = zope.sendmail

Modified: zope.sendmail/trunk/setup.py
===================================================================
--- zope.sendmail/trunk/setup.py	2008-11-14 23:08:44 UTC (rev 92952)
+++ zope.sendmail/trunk/setup.py	2008-11-15 00:23:04 UTC (rev 92953)
@@ -43,7 +43,6 @@
                         'zope.interface',
                         'zope.schema',
                         'zope.security',
-                        'zope.app.component',
                        ],
       include_package_data = True,
       zip_safe = False,

Deleted: zope.sendmail/trunk/src/zope/sendmail/DEPENDENCIES.cfg
===================================================================
--- zope.sendmail/trunk/src/zope/sendmail/DEPENDENCIES.cfg	2008-11-14 23:08:44 UTC (rev 92952)
+++ zope.sendmail/trunk/src/zope/sendmail/DEPENDENCIES.cfg	2008-11-15 00:23:04 UTC (rev 92953)
@@ -1,9 +0,0 @@
-transaction
-# zope.app for UtilityVocabulary
-zope.app
-zope.component
-zope.configuration
-zope.i18nmessageid
-zope.interface
-zope.schema
-zope.security

Modified: zope.sendmail/trunk/src/zope/sendmail/vocabulary.py
===================================================================
--- zope.sendmail/trunk/src/zope/sendmail/vocabulary.py	2008-11-14 23:08:44 UTC (rev 92952)
+++ zope.sendmail/trunk/src/zope/sendmail/vocabulary.py	2008-11-15 00:23:04 UTC (rev 92953)
@@ -17,11 +17,155 @@
 """
 __docformat__ = 'restructuredtext'
 
+import zope.component
 from zope.interface import classProvides
+from zope.interface import implements
+from zope.interface import Interface
+from zope.schema.interfaces import ITokenizedTerm
 from zope.schema.interfaces import IVocabularyFactory
+from zope.schema.interfaces import IVocabularyTokenized
 from zope.sendmail.interfaces import IMailDelivery
-from zope.app.component.vocabulary import UtilityVocabulary
 
+
+class UtilityTerm(object):
+    """A term representing a utility.
+
+    The token of the term is the name of the utility. Here is a brief example
+    on how the IVocabulary interface is handled in this term as a
+    utility:
+    
+    >>> from zope.interface.verify import verifyObject
+    >>> from zope.schema.interfaces import IVocabulary
+    >>> term = UtilityTerm(IVocabulary, 'zope.schema.interfaces.IVocabulary')
+    >>> verifyObject(ITokenizedTerm, term)
+    True
+
+    >>> term.value
+    <InterfaceClass zope.schema.interfaces.IVocabulary>
+    >>> term.token
+    'zope.schema.interfaces.IVocabulary'
+
+    >>> term
+    <UtilityTerm zope.schema.interfaces.IVocabulary, instance of InterfaceClass>
+    """
+    implements(ITokenizedTerm)
+
+    def __init__(self, value, token):
+        """Create a term for value and token."""
+        self.value = value
+        self.token = token
+
+    def __repr__(self):
+        return '<UtilityTerm %s, instance of %s>' %(
+            self.token, self.value.__class__.__name__)
+
+
+class UtilityVocabulary(object):
+    """Vocabulary that provides utilities of a specified interface.
+
+    Here is a short example of how the vocabulary should work.
+
+    First we need to create a utility interface and some utilities:
+
+    >>> class IObject(Interface):
+    ...     'Simple interface to mark object utilities.'
+
+    >>> class Object(object):
+    ...     implements(IObject)
+    ...     def __init__(self, name):
+    ...         self.name = name
+    ...     def __repr__(self):
+    ...         return '<Object %s>' %self.name
+
+    Now we register some utilities for IObject
+
+    >>> from zope.component import provideUtility
+    >>> object1 = Object('object1')
+    >>> provideUtility(object1, name='object1')
+    >>> object2 = Object('object2')
+    >>> provideUtility(object2, name='object2')
+    >>> object3 = Object('object3')
+    >>> provideUtility(object3, name='object3')
+    >>> object4 = Object('object4')
+
+    We are now ready to create a vocabulary that we can use; in our case
+    everything is global, so the context is None.
+
+    >>> vocab = UtilityVocabulary(None, interface=IObject)
+    >>> import pprint
+    >>> pprint.pprint(vocab._terms.items())
+    [(u'object1', <UtilityTerm object1, instance of Object>),
+     (u'object2', <UtilityTerm object2, instance of Object>),
+     (u'object3', <UtilityTerm object3, instance of Object>)]
+
+    Now let's see how the other methods behave in this context. First we can
+    just use the 'in' opreator to test whether a value is available.
+
+    >>> object1 in vocab
+    True
+    >>> object4 in vocab
+    False
+
+    We can also create a lazy iterator. Note that the utility terms might
+    appear in a different order than the utilities were registered.
+
+    >>> iterator = iter(vocab)
+    >>> terms = list(iterator)
+    >>> names = [term.token for term in terms]
+    >>> names.sort()
+    >>> names
+    [u'object1', u'object2', u'object3']
+
+    Determining the amount of utilities available via the vocabulary is also
+    possible.
+
+    >>> len(vocab)
+    3
+    """
+    implements(IVocabularyTokenized)
+    classProvides(IVocabularyFactory)
+
+    # override these in subclasses
+    interface = Interface
+    nameOnly = False
+
+    def __init__(self, context, **kw):
+        utils = zope.component.getUtilitiesFor(self.interface, context)
+        self._terms = dict(
+            (name, UtilityTerm(self.nameOnly and name or util, name))
+            for name, util in utils)
+
+    def __contains__(self, value):
+        """See zope.schema.interfaces.IBaseVocabulary"""
+        return value in (term.value for term in self._terms.values())
+
+    def getTerm(self, value):
+        """See zope.schema.interfaces.IBaseVocabulary"""
+        try:
+            return [term for name, term in self._terms.items()
+                    if term.value == value][0]
+        except IndexError:
+            raise LookupError(value)
+
+    def getTermByToken(self, token):
+        """See zope.schema.interfaces.IVocabularyTokenized"""
+        try:
+            return self._terms[token]
+        except KeyError:
+            raise LookupError(token)
+
+    def __iter__(self):
+        """See zope.schema.interfaces.IIterableVocabulary"""
+        # Sort the terms by the token (utility name)
+        values = self._terms.values()
+        values.sort(lambda x, y: cmp(x.token, y.token))
+        return iter(values)
+
+    def __len__(self):
+        """See zope.schema.interfaces.IIterableVocabulary"""
+        return len(self._terms)
+
+
 class MailDeliveryNames(UtilityVocabulary):
     """Vocabulary with names of mail delivery utilities
 



More information about the Checkins mailing list