# HG changeset patch # User Atul Varma # Date 1271206932 25200 # Node ID 0910577d08fa7dcbb1c345bfbc026262514a8e8e # Parent d5f43c3aeb29e648d61bbb05146f788ca00da046 Added LazyMapping and User.fetch diff -r d5f43c3aeb29 -r 0910577d08fa bugzilla.py --- a/bugzilla.py Tue Apr 13 17:42:36 2010 -0700 +++ b/bugzilla.py Tue Apr 13 18:02:12 2010 -0700 @@ -247,6 +247,22 @@ raise ValueError("bad proptype for '%s': %s" % name, repr(proptype)) +class LazyMapping(object): + def __init__(self, bzapi, klass): + self.__klass = klass + self.__bzapi = bzapi + self.__mapping = {} + + def get(self, name, jsonobj=None): + if name not in self.__mapping: + if jsonobj: + obj = self.__klass(jsonobj, self.__bzapi) + else: + obj = self.__klass.fetch(self.__bzapi, name) + self.mapping[name] = obj + + return self.__mapping[name] + class User(BugzillaObject): """ >>> u = User(TEST_USER, bzapi=None) @@ -278,17 +294,9 @@ self.__real_name = jsonobj.get('real_name') def __fulfill(self): - response = self.bzapi.request('GET', '/user', - query_args={'match': self.name}) - users = response['users'] - if len(users) > 1: - raise BugzillaApiError("more than one user found for " - "name '%s'" % self.name) - elif not users: - raise BugzillaApiError("no users found for " - "name '%s'" % self.name) - self.__email = users[0]['email'] - self.__real_name = users[0]['real_name'] + user = self.__get_user(self.bzapi, self.name) + self.__email = user['email'] + self.__real_name = user['real_name'] @property def email(self): @@ -302,6 +310,35 @@ self.__fulfill() return self.__real_name + def __repr__(self): + return '' % repr(self.name) + + @staticmethod + def __get_user(bzapi, name): + response = bzapi.request('GET', '/user', + query_args={'match': name}) + users = response['users'] + if len(users) > 1: + raise BugzillaApiError("more than one user found for " + "name '%s'" % name) + elif not users: + raise BugzillaApiError("no users found for " + "name '%s'" % name) + return users[0] + + @classmethod + def fetch(klass, bzapi, name): + """ + >>> bzapi = Mock('bzapi') + >>> bzapi.request.mock_returns = TEST_USER_SEARCH_RESULT + >>> User.fetch(bzapi, 'avarma@mozilla.com') + Called bzapi.request('GET', '/user', + query_args={'match': 'avarma@mozilla.com'}) + + """ + + return klass(klass.__get_user(bzapi, name), bzapi) + class Attachment(BugzillaObject): """ >>> bzapi = Mock('bzapi')