* Taggable.add_tags(), Taggable.set_tags() and Taggable.remove_tags()

now only accept a list of tags [API BREAKAGE]. (Closes Issue #52)
This commit is contained in:
Amr Hassan 2011-01-05 06:48:04 +00:00
parent a3649bd1cb
commit bebf474aa9

View file

@ -160,7 +160,7 @@ class Network(object):
sk_gen = SessionKeyGenerator(self) sk_gen = SessionKeyGenerator(self)
self.session_key = sk_gen.get_session_key(self.username, self.password_hash) self.session_key = sk_gen.get_session_key(self.username, self.password_hash)
def __repr__(self): """def __repr__(self):
attributes = ("name", "homepage", "ws_server", "api_key", "api_secret", "session_key", "submission_server", attributes = ("name", "homepage", "ws_server", "api_key", "api_secret", "session_key", "submission_server",
"username", "password_hash", "domain_names", "urls") "username", "password_hash", "domain_names", "urls")
@ -170,6 +170,7 @@ class Network(object):
args.append("=".join((attr, repr(getattr(self, attr))))) args.append("=".join((attr, repr(getattr(self, attr)))))
return text % ", ".join(args) return text % ", ".join(args)
"""
def __str__(self): def __str__(self):
return "The %s Network" %self.name return "The %s Network" %self.name
@ -813,17 +814,17 @@ class _Taggable(object):
def __init__(self, ws_prefix): def __init__(self, ws_prefix):
self.ws_prefix = ws_prefix self.ws_prefix = ws_prefix
def add_tags(self, *tags): def add_tags(self, tags):
"""Adds one or several tags. """Adds one or several tags.
* *tags: Any number of tag names or Tag objects. * tags: A sequence of tag names or Tag objects.
""" """
for tag in tags: for tag in tags:
self._add_tag(tag) self._add_tag(tag)
def _add_tag(self, tag): def _add_tag(self, tag):
"""Adds one or several tags. """Adds one tag.
* tag: one tag name or a Tag object. * tag: a tag name or a Tag object.
""" """
if isinstance(tag, Tag): if isinstance(tag, Tag):
@ -834,10 +835,10 @@ class _Taggable(object):
self._request(self.ws_prefix + '.addTags', False, params) self._request(self.ws_prefix + '.addTags', False, params)
def _remove_tag(self, single_tag): def _remove_tag(self, tag):
"""Remove a user's tag from this object.""" """Remove a user's tag from this object."""
if isinstance(single_tag, Tag): if isinstance(tag, Tag):
single_tag = single_tag.get_name() single_tag = single_tag.get_name()
params = self._get_params() params = self._get_params()
@ -859,9 +860,9 @@ class _Taggable(object):
return tags return tags
def remove_tags(self, *tags): def remove_tags(self, tags):
"""Removes one or several tags from this object. """Removes one or several tags from this object.
* *tags: Any number of tag names or Tag objects. * tags: a sequence of tag names or Tag objects.
""" """
for tag in tags: for tag in tags:
@ -872,9 +873,9 @@ class _Taggable(object):
self.remove_tags(*(self.get_tags())) self.remove_tags(*(self.get_tags()))
def set_tags(self, *tags): def set_tags(self, tags):
"""Sets this object's tags to only those tags. """Sets this object's tags to only those tags.
* *tags: any number of tag names. * tags: a sequence of tag names or Tag objects.
""" """
c_old_tags = [] c_old_tags = []
@ -903,8 +904,8 @@ class _Taggable(object):
if not c_new_tags[i] in c_old_tags: if not c_new_tags[i] in c_old_tags:
to_add.append(new_tags[i]) to_add.append(new_tags[i])
self.remove_tags(*to_remove) self.remove_tags(to_remove)
self.add_tags(*to_add) self.add_tags(to_add)
def get_top_tags(self, limit = None): def get_top_tags(self, limit = None):
"""Returns a list of the most frequently used Tags on this object.""" """Returns a list of the most frequently used Tags on this object."""
@ -979,6 +980,9 @@ class Album(_BaseObject, _Taggable):
self.title = title self.title = title
def __repr__(self):
return "pylast.Album(%s, %s, %s)" %(repr(self.artist.name), repr(self.title), repr(self.network))
@_string_output @_string_output
def __str__(self): def __str__(self):
return _unicode("%s - %s") %(self.get_artist().get_name(), self.get_title()) return _unicode("%s - %s") %(self.get_artist().get_name(), self.get_title())
@ -1139,6 +1143,9 @@ class Artist(_BaseObject, _Taggable):
self.name = name self.name = name
def __repr__(self):
return "pylast.Artist(%s, %s)" %(repr(self.get_name()), repr(self.network))
@_string_output @_string_output
def __str__(self): def __str__(self):
return self.get_name() return self.get_name()
@ -1355,7 +1362,9 @@ class Artist(_BaseObject, _Taggable):
""" """
Returns a sequence of Image objects Returns a sequence of Image objects
if limit is None it will return all if limit is None it will return all
order can be IMAGES_ORDER_POPULARITY or IMAGES_ORDER_DATE order can be IMAGES_ORDER_POPULARITY or IMAGES_ORDER_DATE.
If limit==None, it will try to pull all the available data.
""" """
images = [] images = []
@ -1417,6 +1426,9 @@ class Event(_BaseObject):
self.id = _unicode(event_id) self.id = _unicode(event_id)
def __repr__(self):
return "pylast.Event(%s, %s)" %(repr(self.id), repr(self.network))
@_string_output @_string_output
def __str__(self): def __str__(self):
return "Event #" + self.get_id() return "Event #" + self.get_id()
@ -1620,6 +1632,9 @@ class Country(_BaseObject):
self.name = name self.name = name
def __repr__(self):
return "pylast.Country(%s, %s)" %(repr(self.name), repr(self.network))
@_string_output @_string_output
def __str__(self): def __str__(self):
return self.get_name() return self.get_name()
@ -1713,6 +1728,9 @@ class Library(_BaseObject):
self._artists_index = 0 self._artists_index = 0
self._tracks_index = 0 self._tracks_index = 0
def __repr__(self):
return "pylast.Library(%s, %s)" %(repr(self.user), repr(self.network))
@_string_output @_string_output
def __str__(self): def __str__(self):
return repr(self.get_user()) + "'s Library" return repr(self.get_user()) + "'s Library"
@ -1949,8 +1967,8 @@ class Tag(_BaseObject):
self.name = name self.name = name
def _get_params(self): def __repr__(self):
return {'tag': self.get_name()} return "pylast.Tag(%s, %s)" %(repr(self.name), repr(self.network))
@_string_output @_string_output
def __str__(self): def __str__(self):
@ -1962,6 +1980,9 @@ class Tag(_BaseObject):
def __ne__(self, other): def __ne__(self, other):
return self.get_name().lower() != other.get_name().lower() return self.get_name().lower() != other.get_name().lower()
def _get_params(self):
return {'tag': self.get_name()}
def get_name(self, properly_capitalized=False): def get_name(self, properly_capitalized=False):
"""Returns the name of the tag. """ """Returns the name of the tag. """
@ -2095,6 +2116,9 @@ class Track(_BaseObject, _Taggable):
self.title = title self.title = title
def __repr__(self):
return "pylast.Track(%s, %s, %s)" %(repr(self.artist.name), repr(self.title), repr(self.network))
@_string_output @_string_output
def __str__(self): def __str__(self):
return self.get_artist().get_name() + ' - ' + self.get_title() return self.get_artist().get_name() + ' - ' + self.get_title()
@ -2352,6 +2376,9 @@ class Group(_BaseObject):
self.name = group_name self.name = group_name
def __repr__(self):
return "pylast.Group(%s, %s)" %(repr(self.name), repr(self.network))
@_string_output @_string_output
def __str__(self): def __str__(self):
return self.get_name() return self.get_name()
@ -2526,6 +2553,9 @@ class User(_BaseObject):
self._recommended_events_index = 0 self._recommended_events_index = 0
self._recommended_artists_index = 0 self._recommended_artists_index = 0
def __repr__(self):
return "pylast.User(%s, %s)" %(repr(self.name), repr(self.network))
@_string_output @_string_output
def __str__(self): def __str__(self):
return self.get_name() return self.get_name()
@ -3172,6 +3202,9 @@ class Venue(_BaseObject):
self.id = _number(id) self.id = _number(id)
def __repr__(self):
return "pylast.Venue(%s, %s)" %(repr(self.id), repr(self.network))
@_string_output @_string_output
def __str__(self): def __str__(self):
return "Venue #" + str(self.id) return "Venue #" + str(self.id)
@ -3213,23 +3246,22 @@ def md5(text):
"""Returns the md5 hash of a string.""" """Returns the md5 hash of a string."""
h = hashlib.md5() h = hashlib.md5()
h.update(_string(text)) h.update(_unicode(text).encode("utf-8"))
return h.hexdigest() return h.hexdigest()
def _unicode(text): def _unicode(text):
if sys.version_info.major == 3: if sys.version_info.major == 3:
if type(text) in (bytes, bytearray):
return str(text, "utf-8") return str(text, "utf-8")
else:
return str(text)
elif sys.version_info.major ==2: elif sys.version_info.major ==2:
if type(text) == unicode: if type(text) in (str,):
return text
if type(text) == int:
return unicode(text)
return unicode(text, "utf-8") return unicode(text, "utf-8")
else:
return unicode(text)
def _string(text): def _string(text):
"""For Python2 routines that can only process str type.""" """For Python2 routines that can only process str type."""
@ -3261,7 +3293,7 @@ def _collect_nodes(limit, sender, method_name, cacheable, params=None):
page = 1 page = 1
end_of_pages = False end_of_pages = False
while len(nodes) < limit and not end_of_pages: while not end_of_pages and (not limit or (limit and len(nodes) < limit)):
params["page"] = str(page) params["page"] = str(page)
doc = sender._request(method_name, cacheable, params) doc = sender._request(method_name, cacheable, params)