Search code examples
pythonbuildbotmailnotifier

buildbot doesn't accept my MailNotifier's IEMailLookup object


A number of people in my organization have different email names from perforce names, so I need to create an IEmailLookup derivation that overrides getAddress to do my evil bidding:

(From my master.cfg)

class MyIEmailLookup:
    from buildbot import interfaces
    __implements__ = interfaces.IEmailLookup

    def getAddresses(user):
        address_dict = {"user1", "user_one@our_domain.com"}
        try:
            address = address_dict[user]
        except KeyError:
            address = user + "@our_domain.com"
        return address

maillookup = MyIEmailLookup()

from buildbot.status import mail

c['status'].append(mail.MailNotifier(....
                                     ....
                                     lookup=maillookup
                                    ))

I've tried any number of permutations, but I either get:

Traceback (most recent call last):
  File "/Library/Python/2.6/site-packages/buildbot-0.8.3p1-py2.6.egg/buildbot/scripts/runner.py", line 1071, in doCheckConfig
    ConfigLoader(configFileName=configFileName)
  File "/Library/Python/2.6/site-packages/buildbot-0.8.3p1-py2.6.egg/buildbot/scripts/checkconfig.py", line 46, in __init__
    self.loadConfig(configFile, check_synchronously_only=True)
  File "/Library/Python/2.6/site-packages/buildbot-0.8.3p1-py2.6.egg/buildbot/master.py", line 727, in loadConfig
    exec f in localDict
  File "/Users/playbuilder/buildbot/master.cfg", line 207, in <module>
    lookup=maillookup
  File "/Library/Python/2.6/site-packages/buildbot-0.8.3p1-py2.6.egg/buildbot/status/mail.py", line 293, in __init__
    assert interfaces.IEmailLookup.providedBy(lookup)
AssertionError

...or any other number of issues, dependant upon how I try to implement the IEmailLookup interface.

I'm using buildbot 0.8.3p1 and python 2.6.1.

I see precious few examples of how to do this, and every one of them fails in my context. What am I missing here?


Solution

  • I just solved this problem myself.

    First you need to add (somewhere at the top of the file)

    from zope.interface import implements
    

    and then change

    __implements__ = interfaces.IEmailLookup
    

    to

    if implements:
        implements( interfaces.IEmailLookup )
    else:
        __implements__ = interfaces.IEmailLookup