On Fri, Nov 14, 2008 at 7:23 PM, Hanno Schlichting <[EMAIL PROTECTED]> wrote: > Log message for revision 92953: > Copied over the UtilityTerm and UtilityVocabulary implementation from > zope.app.component to avoid a dependency.
Instead of duplicating the code there should be a zope.utilityvocabulary package that both zope.sendmail and zope.app.component can use. > 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 > > > _______________________________________________ > Checkins mailing list > [EMAIL PROTECTED] > http://mail.zope.org/mailman/listinfo/checkins > -- Benji York Senior Software Engineer Zope Corporation _______________________________________________ Zope-Dev maillist - [email protected] http://mail.zope.org/mailman/listinfo/zope-dev ** No cross posts or HTML encoding! ** (Related lists - http://mail.zope.org/mailman/listinfo/zope-announce http://mail.zope.org/mailman/listinfo/zope )
