get_upcoming_events() no longer returns events with venue IDs. Also fixed/tested other events functions, and removed duplication. Closes #78.

This commit is contained in:
hugovk 2014-03-03 18:41:07 +02:00
parent 40ea12a22f
commit c15923e4cd
2 changed files with 103 additions and 26 deletions

View file

@ -1040,6 +1040,12 @@ class _BaseObject(object):
return hash(self.network) + \
hash(str(type(self)) + "".join(list(self._get_params().keys()) + list(values)).lower())
def _get_events_from_doc(self, doc):
events = []
for node in doc.getElementsByTagName("event"):
events.append(Event(_extract(node, "id"), self.network))
return events
class _Taggable(object):
"""Common functions for classes with tags."""
@ -1508,13 +1514,7 @@ class Artist(_BaseObject, _Taggable):
doc = self._request('artist.getEvents', True)
ids = _extract_all(doc, 'id')
events = []
for e_id in ids:
events.append(Event(e_id, self.network))
return events
return self._get_events_from_doc(doc)
def get_similar(self, limit = None):
"""Returns the similar artists on the network."""
@ -2955,17 +2955,11 @@ class User(_BaseObject):
return self.name
def get_upcoming_events(self):
"""Returns all the upcoming events for this user. """
"""Returns all the upcoming events for this user."""
doc = self._request('user.getEvents', True)
ids = _extract_all(doc, 'id')
events = []
for e_id in ids:
events.append(Event(e_id, self.network))
return events
return self._get_events_from_doc(doc)
def get_artist_tracks(self, artist):
"""Get a list of tracks by a given artist scrobbled by this user, including scrobble time."""
@ -3677,22 +3671,14 @@ class Venue(_BaseObject):
doc = self._request("venue.getEvents", True)
seq = []
for node in doc.getElementsByTagName("event"):
seq.append(Event(_extract(node, "id"), self.network))
return seq
return self._get_events_from_doc(doc)
def get_past_events(self):
"""Returns the past events held in this venue."""
doc = self._request("venue.getEvents", True)
seq = []
for node in doc.getElementsByTagName("event"):
seq.append(Event(_extract(node, "id"), self.network))
return seq
return self._get_events_from_doc(doc)
def md5(text):
"""Returns the md5 hash of a string."""

View file

@ -159,7 +159,7 @@ class TestPyLast(unittest.TestCase):
def test_get_venue(self):
# Arrange
venue_name = "Last.fm Office"
country_name = "United Kingom"
country_name = "United Kingdom"
# Act
venue_search = self.network.search_for_venue(venue_name, country_name)
@ -571,6 +571,97 @@ class TestPyLast(unittest.TestCase):
self.assertFalse(self.network.is_rate_limited())
# Commented out because (a) it'll take a long time and
# (b) it strangely fails due Last.fm's complaining of hitting the rate limit,
# even when limited to one call per second. The ToS allows 5 calls per second.
# def test_get_all_scrobbles(self):
# # Arrange
# lastfm_user = self.network.get_user("RJ")
# self.network.enable_rate_limit() # this is going to be slow...
# # Act
# tracks = lastfm_user.get_recent_tracks(limit = None)
# # Assert
# self.assertGreaterEqual(len(tracks), 0)
def helper_past_events_have_valid_ids(self, thing):
# Act
events = thing.get_past_events()
# Assert
self.helper_assert_events_have_valid_ids(events)
def helper_upcoming_events_have_valid_ids(self, thing):
# Act
events = thing.get_upcoming_events()
# Assert
self.helper_assert_events_have_valid_ids(events)
def helper_assert_events_have_valid_ids(self, events):
# Assert
self.assertGreaterEqual(len(events), 1) # if fails, add past/future event for user/Test Artist
for event in events[:2]: # checking first two should be enough
self.assertIsInstance(event.get_headliner(), pylast.Artist)
def test_artist_upcoming_events_returns_valid_ids(self):
# Arrange
artist = pylast.Artist("Test Artist", self.network)
# Act/Assert
self.helper_upcoming_events_have_valid_ids(artist)
def test_user_past_events_returns_valid_ids(self):
# Arrange
lastfm_user = self.network.get_user(self.username)
# Act/Assert
self.helper_past_events_have_valid_ids(lastfm_user)
def test_user_recommended_events_returns_valid_ids(self):
# Arrange
lastfm_user = self.network.get_user(self.username)
# Act
events = lastfm_user.get_upcoming_events()
# Assert
self.helper_assert_events_have_valid_ids(events)
def test_user_upcoming_events_returns_valid_ids(self):
# Arrange
lastfm_user = self.network.get_user(self.username)
# Act/Assert
self.helper_upcoming_events_have_valid_ids(lastfm_user)
def test_venue_past_events_returns_valid_ids(self):
# Arrange
venue_id = "8778225" # Last.fm office
venue = pylast.Venue(venue_id, self.network)
# Act/Assert
self.helper_past_events_have_valid_ids(venue)
def test_venue_upcoming_events_returns_valid_ids(self):
# Arrange
venue_id = "8778225" # Last.fm office
venue = pylast.Venue(venue_id, self.network)
# Act/Assert
self.helper_upcoming_events_have_valid_ids(venue)
if __name__ == '__main__':
# For quick testing of a single case (eg. test = "test_scrobble")