Package moap :: Package bug :: Module trac
[hide private]
[frames] | no frames]

Source Code for Module moap.bug.trac

 1  # -*- Mode: Python -*- 
 2  # vi:si:et:sw=4:sts=4:ts=4 
 3   
 4  import xmlrpclib 
 5   
 6  from moap.bug import bug 
 7   
8 -def detect(URL):
9 # FIXME: do smarter stuff in there 10 if URL.find('trac') == -1: 11 return None 12 13 if URL.find('/newticket') > -1: 14 URL = URL[:URL.find('/newticket')] 15 16 return URL
17
18 -class Trac(bug.BugTracker):
19 - def __init__(self, URL):
20 bug.BugTracker.__init__(self, URL) 21 self.debug('Contacting server at %s' % self.URL) 22 self._server = xmlrpclib.ServerProxy(self.URL + '/xmlrpc')
23
24 - def getBug(self, id):
25 """ 26 @type id: str 27 """ 28 try: 29 ticket = self._server.ticket.get(int(id)) 30 except xmlrpclib.Fault, e: 31 # FIXME: a Fault has a faultCode and faultString 32 # faultCode is 2 both for "not exist" and "id is not integer" 33 # so we use a fragile string search, boo 34 if e.faultString.find(' does not exist') > -1: 35 raise bug.NotFoundError(id) 36 37 # something else is wrong, reraise 38 raise e 39 40 if not ticket: 41 return 42 return self._getBugFromTicket(ticket)
43
44 - def query(self, queryString):
45 # multicall.ticket is dynamically added 46 __pychecker__ = 'no-objattrs' 47 multicall = xmlrpclib.MultiCall(self._server) 48 try: 49 result = self._server.ticket.query(queryString) 50 except xmlrpclib.Fault, e: 51 raise e 52 for r in result: 53 multicall.ticket.get(r) 54 55 ret = [self._getBugFromTicket(t) for t in multicall()] 56 self.debug('Found %d bugs' % len(ret)) 57 return ret
58
59 - def _getBugFromTicket(self, ticket):
60 """ 61 @type ticket: a list as returned by Trac's xml-rpc interface 62 """ 63 bugId = ticket[0] 64 d = ticket[3] 65 summary = d['summary'] 66 return bug.Bug(bugId, summary)
67 68 BugClass = Trac 69