2011-01-31 1 views
0

Числе людей в моих организациях имеют разные имена электронной почты из неволи имен, так что мне нужно, чтобы создать вывод IEmailLookup, который переопределяет GetAddress делать свои злые торги:BuildBot не принимает мой объект IEMailLookup MailNotifier в

(С мой master.cfg)

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

    def getAddresses(user): 
     address_dict = {"user1", "[email protected]_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 
            )) 

Я пытался любое количество перестановок, но я либо получаю:

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 

... или любое другое число вопросов, висимость как я пытаюсь реализовать интерфейс IEmailLookup.

Я использую buildbot 0.8.3p1 и python 2.6.1.

Я вижу несколько примеров того, как это сделать, и каждый из них терпит неудачу в моем контексте. Что мне здесь не хватает?

ответ

2

Я просто решил эту проблему самостоятельно.

Сначала нужно добавить (где-то в верхней части файла)

from zope.interface import implements 

, а затем изменить

__implements__ = interfaces.IEmailLookup 

в

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

+1 для входа, но я уже давно отказался на стройке и переключился на Дженкинса. Я не мог быть счастливее с решением. – Sniggerfardimungus

+0

'tools (interfaces.IEmailLookup)' достаточно, нет причин иметь 'if tools '. (Если вы импортируете инструменты, то он всегда будет там. В любом случае zope.interface является жесткой зависимостью скрученного и buildbot. –

1

Если вы хотите получать электронную почту от perforce пользователь, вы можете использовать этот класс:

# .-----------------------. 
# | Perforce Email Lookup | 
# `-----------------------' 

from twisted.internet import defer, utils 
from buildbot.util import ComparableMixin 
from buildbot.interfaces import IEmailLookup 
from zope.interface import implements 
import os 
import re 

class PerforceEmailLookup(ComparableMixin): 
    implements(IEmailLookup) 

    compare_attrs = ["p4port", "p4user", "p4passwd", "p4bin"] 

    env_vars = ["P4CLIENT", "P4PORT", "P4PASSWD", "P4USER", 
       "P4CHARSET"] 

    def __init__(self, 
       p4port = None, 
       p4user = None, 
       p4passwd = None, 
       p4bin = 'p4'): 
     self.p4port = p4port 
     self.p4user = p4user 
     self.p4passwd = p4passwd 
     self.p4bin = p4bin 
     self.email_re = re.compile(r"Email:\s+(?P<email>\[email protected]\S+)\s*$") 

    def _get_process_output(self, args): 
     env = dict([(e, os.environ.get(e)) for e in self.env_vars if os.environ.get(e)]) 
     d = utils.getProcessOutput(self.p4bin, args, env) 
     return d 

    @defer.deferredGenerator  
    def getAddress(self, name): 

     if '@' in name: 
      yield name 
      return 

     args = [] 
     if self.p4port: 
      args.extend(['-p', self.p4port]) 
     if self.p4user: 
      args.extend(['-u', self.p4user]) 
     if self.p4passwd: 
      args.extend(['-P', self.p4passwd]) 
     args.extend(['user', '-o', name]) 

     wfd = defer.waitForDeferred(self._get_process_output(args)) 
     yield wfd 
     result = wfd.getResult() 

     for line in result.split('\n'): 
      line = line.strip() 
      if not line: continue 
      m = self.email_re.match(line) 
      if m: 
       yield m.group('email') 
       return 

     yield name 

использование будет выглядеть следующим образом:

c['status'].append(
    MailNotifier(
     sendToInterestedUsers = True, 
     mode     = 'failing', 
     lookup     = PerforceEmailLookup(
             p4port = "perforce:1666", 
             p4user = "buildbot", 
             p4passwd = "buildbot"))) 
0

Попробуйте это:

from buildbot.interfaces import IEmailLookup 
    from buildbot.util import ComparableMixin 
    from zope.interface import implements 
    class lookup_example_email(ComparableMixin): 
     implements(IEmailLookup) 
     def getAddress(self,user): 
      return "%[email protected]"%(user) 

...

mn = MailNotifier(..., lookup=lookup_example_email(), extraRecipients=m) 
Смежные вопросы